理解java中异常处理程序的行为

时间:2015-07-28 18:46:26

标签: java multithreading exception-handling

我一直在尝试理解java中的异常处理程序并经历了大量文章,但最终却更加困惑。我理解一个帖子可能有其特定的ExceptionHandler(threadObject.setExceptionHandler()),应该先检查。如果它没有任何代码,则threadGroup为checked(threadObject.getThreadgroup().uncaughtException(Thread t, Throwable e))

最后,它查找默认的异常处理程序。现在有两件事令我困惑:

  1. 每个线程都有可能拥有自己的defaultExceptionHandler。那么这个范围是什么?
  2. 如果DefaultExceptionHandlers是全局范围的,为什么代码中没有处理异常?

    public class JoinThreads {
        private volatile static int count;
        @SuppressWarnings("static-access")
        public static void main(String[] args) throws InterruptedException {
            // TODO Auto-generated method stub
            Thread t1 = new Thread(new Runnable(){
                public void run(){
                    System.out.println("Thread 1 "+count);
                }
            });
            Thread t2 = new Thread(new Runnable(){
                public void run(){
                    System.out.println("Thread 2");
                    throw new NullPointerException();
                }
            });
            Thread.currentThread().setPriority(Thread.MAX_PRIORITY);    
            t1.start();
            t2.start();
            t2.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    
                @Override
                public void uncaughtException(Thread t, Throwable e) {
                    // TODO Auto-generated method stub
                    System.out.println("Handler 2 "+Thread.currentThread().getName()+" "+e.getMessage());
                }
            });
        }
    }
    
  3. 我希望UncaughtExceptionHandler能够解决这个问题,但线程已经终止并且代码永远不会被执行

    编辑: - 是设置ExceptionHandler解决问题后设置启动方法。谢谢。但是,我想问一些相关的事情。在每个线程的基础上使用DefaultExceptionHandler的含义是什么?如果我为threadObj2声明它,它如何覆盖threadObj 1?

0 个答案:

没有答案