什么是运行时异常以及什么是Checked/Unchecked Exceptions和Error/Exception之间的区别。为什么这些类型很多?相反,Java可以简单地遵循一个简单的设计(只是尝试/捕获所有类型)来处理程序中的异常情况?Runtime/Checked/Unchecked/Error/Exception之间的差异
回答
Throwable处于所有例外状态。 Underneath Throwable你有错误和异常。 在异常下有RuntimeException。
Java有两种类型的异常 - 选中和未选中。检查异常是由编译器执行的(你必须在throws子句中声明它们并最终捕获它们)。未检查的异常不会强制捕获或在throws子句中声明。
(答案中有争议的部分)
Throwable的存在,以便有所有的异常类型的父母。你永远不应该声明你抛出Throwable并且永远不会捕获它(除非你真的真的知道你在做什么)。
指示运行时环境的问题存在错误,您的程序可能无法从中恢复,例如格式错误的类文件或内存不足的虚拟机。除非你真的知道你在做什么,否则你不应该发现一个错误。
作为所有非程序员错误的根存在异常(请参阅RuntimeException中的“异常”),例如由于磁盘已满而无法创建文件。您不应该抛出,抛出或捕获异常。如果你必须赶上例外,请确保你知道你在做什么。
RuntimeException存在以指示所有程序员错误,例如超过数组末尾或调用空对象上的方法。这些是你应该修复的东西,以便它们不会抛出异常 - 表明你,程序员,搞砸了代码。再说一遍,除非你知道你在做什么,否则你不应该抓住这些。
@ TofuBeer的回答清楚地解释了异常类的含义。
Why these many types? Instead Java may simply follow a simple design(just try/catch all types) to handle an abnormal condition in a program?
为什么?因为他们是必要的!如果没有这四类,处理大类的例外将是不切实际的。
- 如果没有
Error
类,你会如何捕获“所有致命的JVM错误”? - 如何在没有
Exception
类的情况下捕获“不是JVM致命错误的所有异常”? - 如果没有
RuntimeException
课程,你会如何捕获“所有未经检查的例外”?
由于我是一名新的Java开发人员,因此在区分和处理不同类型的异常方面也面临一些困难。这就是为什么我在这个话题上做了一个简短的记录,每当我感到困惑的时候,我都会通过它。在这里它与所述Throwable
类层次的图像:
[的JavaTpoint图像礼貌]。
在这里有三个关键类别要记住:Throwable
,Exception
和Error
。在这些类别中,Exception
可以分为两种类型:“检查异常”和“未检查异常”。
经过例外:
- 这些是延伸
Throwable
除了RuntimeException
和Error
的类。 - 它们也被称为编译时异常,因为它们在编译时被检查,这意味着编译器迫使我们或者用
try/catch
来处理它们,或者在函数签名中指示它们throws
它们并迫使我们在调用者中处理它们。 - 它们是由代码控制之外的意外情况(例如数据库故障,文件I/O错误,错误输入等)引起的程序可恢复问题。
- 实施例:
IOException
,SQLException
等
未经检查的异常:
- 延伸
RuntimeException
被称为未检查异常的类。 - 在编译时未检查未检查的异常,而是在运行时检查,因此是名称。
- 它们也是编程上可恢复的问题,但不像检查异常它们是由代码流或配置中的错误引起的。
- 实施例:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
等 - 由于它们的编程错误,它们可以通过很好地/明智编码来避免。例如“除以零”产生一个
ArithmeticException
,这可以通过对除数的简单检查来避免。同样,我们可以通过简单检查参考文献if (object != null)
或甚至使用better techniques来避免NullPointerException
。
错误:
Error
是指没有被一个try/catch
处理无法挽回的局面。- 例子:
OutOfMemoryError
,VirtualMachineError
,AssertionError
等
为什么这么多的类型?
除了Stephen C的回答我想说的是: 异常处理是一个相对昂贵的Java操作。 我们不应该把所有异常情况放在try/catch
区块。过度使用try/catch
可能会妨碍程序性能。
最后,Exception
应尽可能以编程方式处理。另一方面,我们不能处理Error
,所以这些可能是为什么有很多类型的例外的一些合乎逻辑的原因。
为好的图片+1。旁注:“错误”不可捕捉是不正确的。没有人阻止你写'try {sometching(); } catch(Error e){}',但这样做确实是一个坏主意(详情请参阅[@ TofuBeer的回答](https://stackoverflow.com/a/3162916/2448440))。 – Qw3ry 2017-09-01 07:49:34
- 错误(由虚拟机抛出,不应该被捕获或处理)
- VM错误
- 断言错误
- 链接错误......等等
- 运行/不选异常(编程错误,不应被捕获或处理)
- NullPointerException异常
- ArrayIndexOutOfBoundException
- 抛出:IllegalArgumentException ......等等
- 检查异常(别的,有望应用到被捕获或处理)
- IOException异常
- FileNotFoundException异常
- 的SQLException ...等等
- 1. Serilog:之间{..} {差异@ ..}
- 2. /和/ **之间的差异
- 3. 两次之间的差异
- 4. 差异之间的三个
- 5. PHP之间的差异()和[]
- 6. 行之间的Mysql差异
- 7. 行之间的差异
- 8. '//'和'///'之间的C++差异
- 9. SQL:行之间的差异
- 10. sqlite行之间的差异
- 11. 数组之间的差异
- 12. 日期之间的差异
- 13. 2天之间的差异
- 14. 日期之间的差异
- 15. VBA:&和+之间的差异
- 16. 之间的差异和::: ++
- 17. 数据之间的差异
- 18. 列之间的SQL差异以及列与NULL值之间的SQL差异
- 19. 运算符“==”和“=”之间的差异运算符“==”和“=”之间的差异“==”和“=”
- 20. PHP:差异之间 - >和::
- 21. 差异之间保持
- 22. 日期时间之间的差异
- 23. 时间戳。两次之间的差异
- 24. 找到时间之间的差异c
- 25. 2时间戳之间的差异 - PHP
- 26. SQL中时间列之间的差异
- 27. 2个时间戳之间的差异
- 28. Joda时间 - 时区之间的差异
- 29. UTC时间值之间的差异scala
- 30. 以图片之间的差异显示差异
您是否阅读过[Sun Java教程异常教程](http://java.sun.com/docs/books/tutorial/essential/exceptions/)?这可能是一个很好的开始。 – 2010-07-02 02:21:34