我的项目有20个未处理的异常,无关紧要,我想知道它们如何影响JVM?它不会崩溃,但我仍然想知道它们在JVM中的占用空间。他们去哪儿了?
答案 0 :(得分:5)
所有异常都由您的代码或“未捕获的异常处理程序”处理。避免处理异常的唯一方法是从finally块返回或退出程序。
未处理的异常/错误将导致正在运行的线程结束。然而,这是可接受的响应,没有理由这需要扰乱您的应用程序。
Exceptions的一个问题是它们有一些开销,如果你创建了过多的数据,它可能会影响性能。
答案 1 :(得分:3)
每个帖子都有一个名为UncaughtExceptionHandler的东西。每当你有一个没有被任何人捕获的杂散异常时,就会调用Thread的UncaughtExceptionHandler的uncaughtException方法。通常,线程将在未处理的异常上终止。
我不认为,对于未处理的异常与处理的excpetions有很多想法,因为异常的唯一主要性能问题是填充堆栈跟踪,这是在Exception本身创建期间完成的(构造函数最终结束)致电fillInStackTrace())。如果未处理的异常意味着较少的try-catch块(如果在你的情况下是这样),那么你可以从一个角度思考try-catches通常是昂贵的。
答案 2 :(得分:0)
任何未被捕获的Throwable(Runtime Exception或Error)都会杀死抛出throwable的线程。当没有(非守护进程)线程时,JVM进程将退出。
如果您在良好的线程池机制之上运行代码,则线程池将检测到工作线程已死亡,并将在其中创建一个新的工作线程。 我个人believe that you should not catch Throwable,而是捕获运行时异常。
答案 3 :(得分:0)
JVM完全不受未捕获的异常的影响。它通常会杀死线程,但并非总是如此。在EventQueue的情况下,单个事件异常终止但事件不断发生。
未捕获的异常并不好。如果你得到20个未处理的异常并且没有其他问题,你可以通过删除代码和生成它们的线程来提高程序的性能;他们显然没有做任何需要做的事情(至少从产生例外的那一行开始)。
我对未被捕获的例外所遇到的最大问题是它们破坏了程序的稳定性。一个字段得到一个坏数字,后来的计算(在其他线程或事件中)使用那个坏数字,事情从那里走下坡路。有时程序恢复 - 这在演示中很好 - 有时它会慢慢变得越来越糟 - 这在演示中比异常终止更糟糕。通常无法看到堆栈跟踪。即使它应该是显而易见的,我知道测试人员和用户在他们打电话给我之前无法看到它,我已经找出了必然发生的事情,并告诉他们寻找它。 (“哦,是的,这是在我的纸牌游戏中。对不起,如果我说肯定 不显示任何消息。'NullPointerException'。这是什么意思?”)
未被注意的异常通常看起来像是计算中的一个小错误。我浪费了很多时间在我的代码中检查拼写错误。只有当我确信程序无法做到它所能做的事情时,我才知道有一个未被捕获的例外。此外,这些错误可能非常难以重现;程序变得疯狂,但在不同的地方和不同的方式。 (保持系统输出在Solitaire游戏的顶部上,所有调试问题都会消失。)
使用Java 1.5,有一个新方法Thread.setDefaultUncaughtExceptionHandler,它允许您终止程序或以其他方式处理此威胁。使用大量的try / catch块可以让你更好地控制(如果你想要的话),并且是在1.5之前处理这个问题的唯一方法(我知道)。