0

小例子:

 public class App {   
     public static void main(String[] args) {
         throw new RuntimeException("Test exception");
     }
 }

按预期打印以下内容:

Exception in thread "main" java.lang.RuntimeException: Test exception
    at App.main(App.java:5)

让我们修改这个程序:

public class App {    
    public static void main(String[] args) {
        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                if (e instanceof RuntimeException) throw (RuntimeException)e;
            }
        });
        throw new RuntimeException("Test exception");
    }
}

印刷:

Exception: java.lang.RuntimeException thrown from the UncaughtExceptionHandler in thread "main"

问题:

为什么消息不包含有关其发生位置的任何信息,并且没有堆栈跟踪消息?

至于我,异常消息看起来很奇怪。

4

1 回答 1

2

Java API 文档说:

void uncaughtException(Thread t, Throwable e)

当给定线程由于给定的未捕获异常而终止时调用的方法。 Java 虚拟机将忽略此方法引发的任何异常。

因此,如果您希望程序终止某些异常并打印它们的消息/堆栈跟踪,您应该这样做:

        @Override
        public void uncaughtException(Thread t, Throwable e) {
            if (e instanceof RuntimeException) {
                 e.printStackTrace();
                 System.exit(1);
            } 
        }
于 2013-09-20T08:53:42.347 回答