在 Java 程序中,我目前在程序中的某个点收到“未处理的异常”,我似乎无法确定生成该异常的位置。
由于程序包含处理发送和接收的无线数据字节的流,因此调试代码也很困难。我似乎无法用调试器模拟它。
我应该采用什么策略来定位异常?
在 Java 程序中,我目前在程序中的某个点收到“未处理的异常”,我似乎无法确定生成该异常的位置。
由于程序包含处理发送和接收的无线数据字节的流,因此调试代码也很困难。我似乎无法用调试器模拟它。
我应该采用什么策略来定位异常?
实现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();
}
}
}
但是当我运行程序时,设备显示“未处理的异常”并询问我是否关闭应用程序。
首先,您需要在代码中找到生成此消息的位置。听起来该应用程序具有 GUI 或其他任何东西,因此可能是某种对话框。
接下来,在代码中找到导致创建消息/对话框的位置。它很可能是
try
/catch
块,或Exception
Throwable
UncaughtExceptionHandler
。无论哪种情况,接下来都是添加一些代码以使应用程序为未捕获的异常输出堆栈跟踪。假设ex
持有对异常对象的引用:
ex.printStackTrace();
将堆栈跟踪写入标准错误流;例如“控制台”。(如果您找不到“控制台”输出的位置,还有更多重量级的解决方案。)
听起来您在某处发生了未经检查的 RuntimeException。您可以使用 try { } catch(Throwable t) { t.printStackTrace(); 在 main() 方法中轻松尝试它。}
或者,如果您使用 Eclipse 之类的 IDE 对其进行远程调试,则可以将其设置为在 Java 异常断点上触发调试器,并使用“Suspend on uncaught exceptions”。这里有一些文档。
您可以在代码段周围放置一个 try-catch(Exception ex) 块并将其移动/收紧块并让它记录抛出的异常。只要没有太多代码,您应该能够在几次运行中跟踪它。
如果您没有堆栈跟踪,那么您将无能为力。
如果它实际上是由另一方引起的,并且您收到了这条消息,那么您应该向另一方询问堆栈跟踪或类似信息。
编辑:您当然应该确保您自己的代码不会吞下以下异常:
} 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;
}
希望这可以帮助。