java - 在这段代码中,异常是如何产生的?

标签 java exception

有一些第三方代码如下所示。假设有两个类,classA 和 classB,它们的定义是正确的并且按预期工作。

// this function does not have a *throws Exception* in its definition
public Collection<classA> doSomething(String someStr) {

    List<ClassA> ClassAList = new ArrayList<ClassA>();
    int a = 0;

    while (a < 5) {
        classAList.add(
            new classA(
                someStr,
                new Callable<classB>() {
                    public classB call() throws Exception {
                        // do some work here
                        try {
                            // try something new
                        } catch (Exception e) { // <---- THIS EXCEPTION
                            // do something exceptional
                            throw e;
                        }
                        // do more work here, because why not?
                    }
                }
            )
        );
        a++;
    }
    return classAList;
}

这是一个人为的示例,因此可能并不完全合理。但是,它准确地反射(reflect)了我拥有的代码。

我想弄清楚的是,如果抛出异常会发生什么?异常是否突破,整个 doSomething 函数失败? (我怀疑是这种情况,但是上层函数没有“抛出异常”,所以可能是我错了?)

我对 Java 比较陌生,以前绝对没有见过这种编程风格(另外,如果你知道它叫什么,这样我可以更多地研究它,请告诉我) - 我有 C 背景和 Python,所以 -__(o.O)__/-

注意:这是某些东西的扩展,因此不能直接运行进行调试。

注释 2:此问题被标记为可能与 this 重复。 。我不是问如果没有抛出异常子句,它是如何编译的。我试图找出抛出异常的位置/时间。

最佳答案

我假设 Callable此处输入 java.util.concurrent.Callable .

实际上永远不会在 doSomething 的堆栈帧上抛出异常。 。这是因为它是在实现 Callable<classB> 的匿名内部类中定义的。 。 doSomething 中没有调用它根本不。然后将匿名类的实例传递给 classA的构造函数,创建 classA 的新实例并将其放入列表中。这解释了为什么doSomething不需要throws

现在,如果您要访问该列表,请获取 Callable<classB>来自 classA 的实例,并调用Callable.call() ,您确实需要通过添加“try...catch or adding a”来处理已检查的异常。在周围的方法中抛出`子句,如下所示:

public void doSomethingElse() throws Exception{
    ClassAList.get(0).getCallable().call(); // exception might be thrown here!
}

关于java - 在这段代码中,异常是如何产生的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49326629/

相关文章:

c++ - 在析构函数中正确使用 std::uncaught_exception

c++ - 内存标准头和包含文件之间的区别

java - 如何形成 jdbcTemplate 的查询

android - 从 Android 设备发送 HTTPS/HTTP POST 时出现 UnknownHostException

java - 如何使用 Struts 2 在同一行中放置多个文本字段而不使用主题 ="simple"?

java - 界面设计问题: Storing Result of Transactions

python : Extending Exception class

java - 当 try block 中的多行抛出异常时,使用 Try-With-Resources 而不是 finally block

java - 融合位置管理器 API 准确性

java - 如何在 Eclipse 调试配置中指定 cucumber 标签作为调用参数?