Android Studio 为什么catch语句不能捕获错误?

ldfqzlk8  于 2023-10-23  发布在  Android
关注(0)|答案(1)|浏览(140)

由于某种原因,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次调用之间完全随机。

4ngedf3f

4ngedf3f1#

因为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语句检查条件。

相关问题