所以我有一些代码会抛出RuntimeException。我知道它抛出了一个RuntimeException,我在某些情况下写了这样做。最近,我遇到了我认为是僵局的问题,因为该方法似乎没有完成,但是当我注销问题时,我意识到它实际上是RuntimeException。
现在,问题出现了:此异常正在以静默方式发生。 Android Studio中的Android监视器不显示堆栈跟踪。这让我失望了,因为在普通的Java应用程序中(我比较习惯,我是专业的Java开发人员,但我对Android来说是新手),RuntimeExceptions直接向控制台发送堆栈跟踪
所以,我的反应是做一个Thread.UncaughtExceptionHandler来记录它。只是......它不起作用。
这是我的UncaughtExceptionHandler。我并没有真正关心它做它所做的所有事情,我只是试图让事情发生,以表明它正在被召唤。
public static class ContactsUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{
private static final String TAG = "UncaughtException";
@Override
public void uncaughtException(Thread thread, Throwable throwable) {
System.out.println("UNCAUGHT EXCEPTION"); //TODO delete this
Log.e(TAG, String.format("Uncaught exception in thread %d", thread.getId()), throwable);
throwable.printStackTrace();
System.exit(1);
}
}
此处理程序以下列方式添加:
1)我有一个执行者产生线程。它使用ThreadFactory,它使用Thread.setUncaughtExceptionHandler()将此处理程序分配给每个线程。
2)我在Application类的onCreate()方法中调用Thread.setDefaultUncaughtExceptionHandler()。
3)发生这种情况的代码是Runnable.run()方法。我在run()方法中放了一行调用Thread.currentThread()。setUncaughtExceptionHandler()。
没有任何作用。这些操作都没有被触发。
我完全知道发生了RuntimeException,因为如果我用try-catch块包围代码并以这种方式执行printStackTrace(),它会显示在控制台日志中。我无法让UncaughtExceptionHandler工作。
发生这种情况的代码非常漫长而详细,这里有一个快速摘要:
@Override
public void run(){
Thread.currentThread().setUncaughtExceptionHandler(new ContactsThreadFactory.ContactsUncaughtExceptionHandler());
System.out.println("This line outputs to the console");
object.callingMethodThatCausesException();
System.out.println("This line never executes, because exception was thrown");
}
有关如何解决此问题的任何想法?我不明白为什么它不起作用。
编辑:刚刚发现了一些有趣的东西,而不是100%确定它意味着什么。我把"抛出了新的RuntimeException()"进入我的Activity类的onCreate()方法,该异常在正常情况下显示在控制台中。我尝试从Runnable中做同样的事情,什么也没做。不完全确定如何做到这一点。
另外,UncaughtExceptionHandler适用于我输入的新RuntimeException。我只是不明白它为什么不在别的地方工作?