有一些第三方代码如下所示。假设有两个类,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/