我有这个方法:
public void foo(){
int test = 5/0;
}
我称之为:
try {
foo();
} catch (Exception e){
e.printStackTrace();
}
这会捕获ArithmeticException
,但我看到我在try-catch
内调用方法的情况,但它没有捕获异常。是否存在exception
未被捕获的具体情况?
以下是澄清问题的示例:
ActivityA
中的try-catch块是否捕获ActivityB
中的异常?我知道答案是否定的。但我想知道这背后的逻辑。
public class ActivityA extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
try {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
startActivity(new Intent(this, ActivityB.class));
} catch (Exception e){
e.printStackTrace();
}
}
}
ActivityB
:
public class ActivityB extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
int x = 5/0
}
}
对于所有认为这是一个重复问题的酷人,请给我一个关于StackOverFlow问题的链接,该问题回答了这个非常明确的问题:try-catch是否捕获在其中调用的方法中发生的异常?
答案 0 :(得分:0)
可能发生的事情是你试图捕获一个不是被解雇的异常。
对于ArithmeticException
,例如,NumberFormatException
,例如,Exception
,它将不会保留public class ResultsItem {
private String model;
private int id;
private int distanceLon;
private String brand;
@Ignore
private List<BidsItem> bids;
private User user;
@Ignore
private List<FotosItem> fotos;
// getters/setters...
}
并停止您的申请。
答案 1 :(得分:0)
如果您抓住Exception
,Exception
本身,并且该块将捕获所有Exception
子类型的异常。在Java中,将是所谓的&#34;已检查的异常&#34;。
然而,你不会抓住那些&#34;例外&#34;这只是Throwable
的子类型。确切地说,那些不是实际的例外。他们是错误。也可以在try-catch语句中捕获它们。
不是说捕捉Exception
和Throwable
都不是一个好习惯。始终抓住您期望的特定例外和错误。
答案 2 :(得分:0)
如果指定要捕获的异常,例如
public void foo(numb, divisor) throws ArithmeticException {
if (divisor == 0) throw new ArithmeticException();
int ans = num / divisor;
}
@Test
public void tesfooWithZeroDivisor() {
try {
foo(5, 0);
} catch (ArithmeticException e) {
System.out.println("Can't divide by zero");
}
}
在这种情况下,您指定要在抛出时捕获ArithmeticException。如果没有抛出ArithmeticException而是抛出异常,例如IllegalArgumentException,那么它将不会捕获IllegalArgumentException,因为您只指定了ArithmeticException。
在您的情况下,您使用了catch (Exception e)
,这意味着您没有指定异常,因此它将捕获任何抛出的异常。
答案 3 :(得分:0)
是否存在可能无法捕获异常的特定情况?
有些情况让人想起:
foo()
的调用)。所以没有抛出异常。foo()
方法是从其他位置调用的;例如在不同的线程堆栈上。my.pkg.ArithmeticException
)并且您正在捕获因结果而引发的异常instanceof
测试可能无法匹配。try-catch是否捕获在其内部调用的方法中发生的异常?
是。如果你已经正确实施了;见上文。
如果您想要章节和经文,请阅读JLS 14.20。
关于您更新的示例,我不希望 ActivityA
的异常处理程序看到ActivityB.onCreate
中抛出的异常。我希望onCreate()
可以被另一个线程调用。
您可以通过在ActivityB.onCreate
中捕获异常并查看堆栈跟踪来确认这一点。