提问人:user20958695 提问时间:9/8/2023 更新时间:9/8/2023 访问量:82
为什么 catch 语句不捕获错误?
Why catch statement doesn't catch the error?
问:
由于某种原因,catch 语句没有捕获我的项目中的错误。
我创建了一个迷你项目来重现错误:它有两个活动,它分别在它们之间切换 和 。startActivity()
finish()
public class MainActivity extends AppCompatActivity {
static int counter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
System.out.println(counter);
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
} catch (Throwable e) {
System.out.println("Error");
}
}
@Override
protected void onPostResume() {
super.onPostResume();
if (counter++ < 100) {
try {
System.out.println(counter);
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
} catch (Throwable e) {
System.out.println("Error");
}
}
}
}
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
finish();
}
}
尽管所有内容都包含在 try-catch 语句中,并且我的目标是捕获尽可能高的类型,但它无法捕获它。
这是堆栈跟踪:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 22538
java.lang.IllegalArgumentException: Activity client record must not be null to execute transaction item: TopResumedActivityChangeItem{onTop=true}
at android.app.servertransaction.ActivityTransactionItem.getActivityClientRecord(ActivityTransactionItem.java:66)
at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:43)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2308)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7898)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
知道为什么不能捕捉到以及如何避免崩溃吗?
不是最初的问题,而是关于如何解决此崩溃的任何一般想法(因此首先不需要捕获它)也会有所帮助,因为我找不到任何有效的解决方案。该错误发生在我用于 Android Studio 模拟器的特定设备上:“Nexus 6”和 API 33。我在模拟器中使用的其他几台设备中没有遇到这个问题。错误通常在第 50 次左右被调用,但在 1 到 100 次调用之间似乎完全随机。startActivity()
答:
由于 try 块中的代码不会真正引发可以捕获的异常,因此程序中的 try-catch 块不太可能捕获任何异常。
Android startActivity 函数抛出的异常没有经过检查的异常,您可以使用 try-catch 块捕获这些异常。相反,它可能会引发运行时异常,例如 ActivityNotFoundException 或 SecurityException,这些异常不必显式捕获。
您可以采取以下措施来处理启动活动时出现的异常:
try {
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
} catch (ActivityNotFoundException e) {
// Handle the case where the activity is not found
e.printStackTrace();
} catch (SecurityException e) {
// Handle the security exception
e.printStackTrace();
} catch (Exception e) {
// Handle any other exceptions
e.printStackTrace();
}
但是,通常最好设计代码,使控制流不依赖于捕获异常。相反,在调用该方法之前,可以使用条件语句来查找可能导致异常的情况。因此,您的代码将变得更有弹性和可理解性。
在特定情况下,如果希望在满足特定条件时阻止启动 SecondActivity,则可以在调用 startActivity 之前使用 if 语句检查条件。
评论
MainActivity