在Java程序中,我目前在程序中的某个点遇到“Unhandled Exception”,我似乎无法确定生成它的位置。
由于程序包含处理发送和接收的无线数据字节的流,因此也难以调试代码。我似乎无法用调试器模拟它。
我应该采用什么策略来找到例外?
答案 0 :(得分:11)
实施Thread.UncaughtExceptionHandler
界面并使用setDefaultUncaughtExceptionHandler()
进行设置。
示例程序礼貌。如果你使用多个线程,你也可以在你怀疑是罪魁祸首的线程上设置处理程序。
public class Test {
public static void main(String args[]) {
new Test();
}
public Test() {
Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
// or if a default handler is set you can also use setUncaughtExceptionHandler
// check the javadocs for the specifics
throw new RuntimeException ("You can't get me or can you?");
}
class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
public void uncaughtException(Thread t, Throwable e) {
System.err.println ("Uncaught exception by " + t + " caught:");
e.printStackTrace();
}
}
}
答案 1 :(得分:1)
如果您没有堆栈跟踪,则无法做很多事情。
如果它实际上是在另一方引起的并且您收到此消息,那么您应该向另一方询问堆栈跟踪或类似信息。
修改:您当然应该确保自己的代码不会像以下一样吞噬异常:
} catch (Exception e) {
// Do nothing.
}
或
} catch (Exception e) {
System.out.println("Error");
}
或
} catch (Exception e) {
System.out.println(e.toString());
}
要从异常中获取最多信息,您至少应该这样做:
} catch (Exception e) {
e.printStackTrace();
}
或只是
} catch (Exception e) {
throw e;
}
希望这有帮助。
答案 2 :(得分:1)
您可以在代码段周围放置一个try-catch(Exception ex)块并移动它/收紧块并让它记录抛出的异常。只要没有太多代码,您就应该能够在几次运行中跟踪它。
答案 3 :(得分:1)
但是当我运行程序设备时 显示“未处理的例外”并询问 我是否关闭应用程序。
首先,您需要在代码中找到生成此消息的位置。听起来这个应用程序有GUI或其他什么,所以它可能是某种对话框。
接下来,在代码中找到导致创建消息/对话框的位置。它很可能是
try
/ catch
阻止Exception
或Throwable
或UncaughtExceptionHandler
。在任何一种情况下,接下来要添加一些代码以使应用程序输出未捕获异常的堆栈跟踪。假设ex
拥有对异常对象的引用:
ex.printStackTrace();
会将堆栈跟踪写入标准错误流;例如“控制台”。 (如果找不到“控制台”输出的位置,有更多的重量级解决方案。)
答案 4 :(得分:1)
听起来你在某处发生了未经检查的RuntimeException。您可以使用try {} catch(Throwable t){t.printStackTrace();在main()方法中轻松尝试它。 }
或者如果您使用像Eclipse这样的IDE远程调试它,您可以将其设置为在Java异常断点上触发调试器,并使用“暂停未捕获的异常”。一些文档here。