Vit*_*lyB 11 java android exception-handling exception
我正在尝试创建一个简单的异常处理程序,它将帮助我调试应用程序.现在,当我遇到异常时,我被迫连接Eclipse调试器只是为了查看异常细节.
为了避免这种情况,我使用了setUncaughtExceptionHandler来处理任何未处理的异常并在异常上显示Toast.不幸的是,这不起作用.
public class TicTacToe extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
Toast.makeText(TicTacToe.this, "TOAST", Toast.LENGTH_LONG).show();
}
});
setContentView(R.layout.main);
Button continueButton = (Button) findViewById(R.id.cell01);
continueButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int i = 5;
i = 5 / 0;
Toast.makeText(TicTacToe.this, "BUTTON", Toast.LENGTH_LONG).show();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
基本上我用一个按钮制作了一个表单,按下它,它将抛出一个零度异常.但是,按下按钮不会导致显示全局Toast处理程序.相反,按钮保持橙色(按下),没有任何反应.
不用说,如果我评论出i = 5/0; 我看到吐司说按了一个按钮.
两个问题:1)为什么在UncaughtExceptionHandler体中没有显示toast ?怎么导致它显示?2)是否有替代/更好的全局异常处理方式?我想我可以在android模拟器上安装aLogCat并简单地记录未捕获的异常,但似乎不太舒服 - 我需要切换应用程序只是为了查看异常细节.
谢谢!
Lab*_*lan 14
有可能的.你需要在另一个线程内执行它
然后它应该是这样的
Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
new Thread() {
@Override
public void run() {
Looper.prepare();
Toast.makeText(TicTacToe.this, "TOAST", toast.LENGTH_LONG).show();
Looper.loop();
}
}.start();
}
});
Run Code Online (Sandbox Code Playgroud)
Ric*_*ler 11
您没有看到任何内容,因为您的UI线程上发生了异常,并且堆栈一直展开.所以没有更多的Looper,并且没有用于显示Toast的支持.如果要在屏幕上显示异常信息,则很可能需要在另一个进程中启动另一个Activity.
您的UncaughtExceptionHandler也存在问题.你真的应该保留对旧的引用并在结束时调用它uncaughtException允许系统显示强制关闭按钮.