由于某种原因,catch语句没有捕获我的项目中的错误。
我创建了一个小项目来重现错误:它有两个Activity,并分别使用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。我在模拟器中使用的其他几个设备中没有遇到这个问题。错误通常在startActivity()
被调用的第50次左右发生,但它似乎在1到100次调用之间完全随机。
1条答案
按热度按时间4ngedf3f1#
因为try块中的代码不会真正抛出可以捕获的异常,所以程序中的try-catch块不太可能捕获任何异常。
Android startActivity函数不会抛出可以使用try-catch块捕获的检查异常。相反,它可能会抛出运行时异常,如ActivityNotFoundException或SecurityException,这些异常不必显式捕获。
您可以采取以下操作来处理启动活动时出现的异常:
但是,通常最好将代码设计为控制流不依赖于捕获异常。相反,在调用该方法之前,可以使用条件语句来查找可能导致异常的情况。因此,您的代码变得更有弹性和可理解性。
在您的特定情况下,如果您希望在满足特定条件时防止启动SecondActivity,则可以在调用startActivity之前使用if语句检查条件。