Java线程异常终止,并带有消息null的异常。

问题描述:

我正在尝试使用Java的Executors来执行多线程程序。在执行时,java线程异常终止。我通过try-catch发现了异常,但是,异常没有消息(空)。Java线程异常终止,并带有消息null的异常。

失败是随机的,但我“怀疑”失败发生后,我已经在该线程中的函数调用发生。我试图将线程堆栈大小增加到1024/2048,但结果保持不变。

有人可以指出在这里采用的调试方法。因为,我没有关于例外的信息,我无法继续处理它。

我在Windows 64位环境中工作,与Java 1.6

+2

请告诉我们异常类的名称(如'NullPointerException')。堆栈跟踪也可能有帮助。 – 2012-03-05 06:43:15

+0

您可能遇到NullPointerException。你可以在这里发布一部分代码吗? – 2012-03-05 06:43:23

+0

你可以用它来获得堆栈跟踪: ... catch(Exception e){e.printStackStrace();} – Sibbo 2012-03-05 07:34:02

当使用Executors类来创建线程池使用接受的ThreadFactory的方法;示例ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory)。 在你的ThreadFactory的实现中,分配一个UncaughtExceptionHandler;示例如下

public final Thread newThread(final Runnable r) { 
    Thread newThread = threadFactory.newThread(r); // you can use default thread factory 
    newThread.setName("threadName"); 
    newThread.setDaemon(Boolean.TRUE); 
    newThread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() { 
     @Override 
     public void uncaughtException(final Thread t, final Throwable e) { 
      // log 
     } 
    }); 
    return newThread; 
} 
+0

谢谢,这看起来像一个很好的编程习惯,尤其是内层子程序中未捕获的异常。 – 2012-03-05 10:45:26

+0

以提供更多详细信息,通过ExecutorService提交的任务被包装到FutureTask中,该FutureTask捕获Throwable并通过FutureTask#get()提供异常。所以这种做法真的很有道理。 – Scorpion 2012-03-05 10:48:05

+0

谢谢!还发现我们也可以从相同的FutureTask获得超时。我一直在寻找这个,很久!谢谢!! – 2012-03-13 10:37:55