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

Why catch statement doesn't catch the error?

提问人:user20958695 提问时间:9/8/2023 更新时间:9/8/2023 访问量:82

问:

由于某种原因,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()

Java Android-Studio 异常

评论

3赞 Jorn 9/8/2023
正如你所看到的,你的方法甚至没有在堆栈跟踪中被提及。因此,异常被抛出到另一个线程中。MainActivity

答:

0赞 user22475952 9/8/2023 #1

由于 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 语句检查条件。