在被调用的方法/函数Java/Android中处理异常?
我得到了这个方法:
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();
}
}
}
和{
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是否捕获在其内部调用的方法中发生的异常
# 1 楼答案
我突然想到了一些情况:
foo()
的调用)未执行。所以没有抛出异常李>foo()
方法是从其他地方调用的;e、 g.在不同的线程堆栈上李>my.pkg.ArithmeticException
),因此捕获的异常与抛出的异常不同instanceof
测试可能无法匹配李>对。如果你实施得当;见上图
如果你想要章和节,读JLS 14.20
关于您更新的示例,我不希望
ActivityA
的异常处理程序看到ActivityB.onCreate
中抛出的异常。我希望onCreate()
被另一个线程调用您可以通过在
ActivityB.onCreate
中捕获异常并查看stacktrace来确认这一点# 2 楼答案
如果指定要捕获的异常,例如
在本例中,您指定希望在抛出时捕获算术异常。如果没有引发算术异常,但引发了不同的异常,例如IllegalArgumentException,那么它将不会捕获IllegalArgumentException,因为您只指定了算术异常
在本例中,您使用了
catch (Exception e)
,这意味着您没有指定异常,因此它将捕获任何抛出的异常# 3 楼答案
可能发生的情况是,您试图捕获一个异常,而该异常不是被触发的异常。 在
ArithmeticException
的情况下,如果您启动一个,例如,NumberFormatException
,它将不会保存Exception
,并将停止您的应用程序# 4 楼答案
如果捕获^{} ,
Exception
本身以及作为Exception
子类型的所有异常都将被该块捕获。在Java中,这就是所谓的“检查异常”但是,您将无法捕获那些只是^{} 的子类型的“异常”。确切地说,这些并非偶然的例外。这些都是错误。也可以在try-catch语句中捕获它们
并不是说抓
Exception
和Throwable
都不是好的做法。始终捕获您预期的特定异常和错误