运行时/已选中/未选中/错误/异常之间的差异
什么是运行时异常,什么是已检查/未检查异常以及错误/异常之间的区别。为什么会有这么多类型?相反,Java可以简单地遵循一个简单的设计(只是尝试/捕获所有类型)来处理程序中的异常情况?
什么是运行时异常,什么是已检查/未检查异常以及错误/异常之间的区别。为什么会有这么多类型?相反,Java可以简单地遵循一个简单的设计(只是尝试/捕获所有类型)来处理程序中的异常情况?
由于我是一名新的Java开发人员,因此在区分和处理不同类型的异常方面也遇到了一些困难。这就是为什么我在这个问题上做了一个简短的笔记,每当我感到困惑时,我都会经历它。这里是类层次结构的图像:Throwable
[图片由JavaTpoint提供]。
此处要记住三个关键类:、 和 。这些类可以分为两种类型:“已检查的异常”和“未检查的异常”。Throwable
Exception
Error
Exception
已检查异常:
Throwable
RuntimeException
Error
try/catch
throws
IOException
SQLException
未选中的异常:
RuntimeException
ArithmeticException
NullPointerException
ArrayIndexOutOfBoundsException
ArithmeticException
NullPointerException
if (object != null)
错误:
Error
指 无法恢复的情况,该情况未由 处理。try/catch
OutOfMemoryError
VirtualMachineError
AssertionError
为什么有这么多类型?
除了Stephen C的答案之外,我还想说:异常处理在Java中是一个相对昂贵的操作。我们不应该把所有的特殊情况都放在一个尝试/捕获
块中。过度使用 try/catch
s 可能会妨碍程序性能。
总之,应尽可能以编程方式处理 s。另一方面,我们无法处理 s,因此这些可能是存在许多类型异常的一些逻辑原因。Exception
Error
可抛出是所有异常的顶部。在“可抛出”下,您有错误和异常。在 Exception 下面,你有 RuntimeException。
Java 有两种类型的异常 - 选中和未选中。已检查的异常由编译器强制执行(您必须在 throws 子句中声明它们并最终捕获它们)。未选中的异常不会强制执行以捕获或在 throws 子句中声明。
(有争议的部分答案)
存在可抛出,以便所有异常类型都有一个父级。你永远不应该声明你投掷了可投掷的,也永远不要抓住它(除非你真的真的知道你在做什么)。
存在错误表示运行时环境存在问题,即程序可能无法从中恢复的内容,例如格式不正确的类文件或 VM 内存不足。除非您真正知道自己在做什么,否则不应捕获错误。
异常作为所有非程序员错误的根目录存在(请参阅 RuntimeException 以了解此“异常”),例如由于磁盘已满而无法创建文件。不应抛出、抛出或捕获异常。如果您必须捕获异常,请确保您知道自己在做什么。
运行时异常的存在是为了指示所有程序员错误,例如越过数组的末尾或在 null 对象上调用方法。这些是你应该修复的事情,这样它们就不会引发异常 - 表明你,程序员,搞砸了代码。同样,除非您知道自己在做什么,否则您不应该抓住这些。