运行时/检查/未选中/错误/异常之间的差异
-
02-10-2019 - |
题
什么是运行时异常,检查/未选中的异常和错误/异常之间的差异是什么?为什么这些类型?相反,Java可以简单地遵循简单的设计(只需尝试/捕获所有类型)即可处理程序中的异常情况?
解决方案
可投掷是所有例外的顶部。在可投掷的下方,您有错误和例外。在例外,您有RuntimeException。
Java有两种类型的异常 - 检查和未选中。编译器强制执行检查的例外(您必须在“投掷”子句中声明它们并最终捕获它们)。在掷球子句中捕获或宣布未经检查的例外。
(答案的有争议的部分)
存在可投掷,因此有所有异常类型的父母。您绝不应该宣布您投掷可投掷并永远不会抓住它(除非您真的真的真的知道自己在做什么)。
存在错误以指示运行时环境的问题,即您的程序可能无法从中恢复的问题,例如格式不佳的类文件或VM用完存储器。除非您真的知道自己在做什么,否则您不应遇到错误。
异常是所有非编程器错误的根(请参阅此“异常”的RuntimeException),例如由于磁盘已满,因此无法创建文件。您不应该投掷,投掷或捕获异常。如果您必须捕获异常,请确保您知道自己在做什么。
存在RunTimeException以指示所有程序员错误,例如超越数组的末尾或调用NULL对象上的方法。这些是您应该修复的事情,以便它们不引发异常 - 表明您,程序员将代码搞砸了。同样,除非您知道自己在做什么,否则您不应抓住这些。
其他提示
由于我是一个新的Java开发人员,因此我还面临一些区分和处理不同类型异常的困难。这就是为什么我对这个话题做了简短的说明,每当我感到困惑时,我都会经历。这里是 Throwable
类层次结构:
图像提供 Javatpoint].
这里有三个关键类要记住: Throwable
, Exception
和 Error
. 。在这些课程中 Exception
可以分为两种类型:“检查异常”和“未检查的异常”。
检查例外:
- 这些是扩展的类
Throwable
除了RuntimeException
和Error
. - 它们也被称为编译时间例外
try/catch
或在功能签名中指示它throws
他们并强迫我们在呼叫者中与他们打交道。 - 它们是可恢复的问题,是由代码控制之外的意外条件引起的(例如数据库降低,文件I/O错误,错误输入等)。
- 例子:
IOException
,SQLException
, , ETC。
未选中的例外:
- 扩展的类
RuntimeException
被称为未选中的例外。 - 未检查的例外情况未在编译时检查,而是在运行时检查,因此名称。
- 它们也是可以恢复的编程性问题,但与 检查例外 它们是由代码流或配置中的故障引起的。
- 例子:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
, , ETC。 - 由于它们是编程错误,因此可以通过很好/明智地编码来避免它们。例如,“除以零”会产生
ArithmeticException
, ,可以通过对除数的简单检查来避免这种情况。同样,我们可以避免NullPointerException
通过简单地检查参考文献:if (object != null)
甚至使用 更好的技术.
错误:
Error
指的是无法解决的情况try/catch
.- 例子:
OutOfMemoryError
,VirtualMachineError
,AssertionError
, , ETC。
为什么这些类型?
此外 斯蒂芬c我想说的答案:例外处理是Java的一个相对昂贵的操作。 我们不应该把所有特殊情况放在 try/catch
堵塞。过度使用 try/catch
S May妨碍了计划的性能。
综上所述, Exception
S应尽可能以编程方式处理。另一方面,我们无法处理 Error
S,因此这些可能是有很多类型的异常的逻辑原因。
Tofubeer的答案 清楚说明异常类的含义。
为什么这些类型?相反,Java可以简单地遵循简单的设计(只需尝试/捕获所有类型)即可处理程序中的异常情况?
为什么?因为它们是必要的!如果没有这四个类别,则按广泛的类别处理例外将是不切实际的。
- 您如何在没有的情况下捕获“所有致命的JVM错误”
Error
班级? - 您如何在没有的情况下捕获“所有不是JVM致命错误的例外”
Exception
班级? - 您如何在没有的情况下捕获“所有未选中的例外”
RuntimeException
班级?
- 错误(由VM投掷,不应捕获或处理)
- VM错误
- 断言错误
- 链接错误...
- 运行时/UNCHECK异常(编程错误,不应捕获或处理)
- 空指针异常
- ArrayIndexOutOfBoundException
- nirgalargumentException ...
- 检查异常(其他任何内容,预计将被捕获或处理)
- ioException
- FILENOTFOUNDEXCEPTION
- sqlexception ...等等
运行时异常为您提供了避免捕获并声明异常的灵活性。
检查和未选中的例外之间的区别:
我们在检查和未检查的例外之间存在许多差异,但是所有差异都来自曾经的基本考虑,即是否是 编译器是否可以解决异常。
要记住的要点是:
1]检查的异常手段 编译器检查了异常. 。这意味着编译器要求通过try-catch块或抛出关键字来处理此类例外。
2]未选中的例外是编译器 不提供任何任务 由于可以通过编码/编程来解决它们,因为控制流是可以控制的,例如arithmeticexception,nullpoInterException arrayIndIndexOutofBoundSexception,iLlegalArgumentException等。
我称之为 “异常 - 身份测试” 在您从Java Doc中获取任何随机例外的地方,然后问一个问题。 “嘿例外!您可以通过程序解决吗?”
如果例外说 是的 然后,这是一个未选中的例外,因为可以通过更改代码或解决某些计算错误等来解决。
另一方面,如果例外说 不 然后,该检查的异常如在检查异常控制流中从我们的代码中输出,例如某人更改数据库密码或有人拔下网络电缆,连接超时(ConnectException),找不到某些资源(filenotfoundexception,classNotFound),sqlexlexception,sqocatontontargetException et invocatontargetection等。这些不能通过编程来解决
这个 文章 汇总 检查 和 未选中 以清晰而简洁的方式例外。
检查例外: 检查例外 是可以在编译时检测,识别和检查的例外。如果代码块抛出了检查的异常,则该方法必须处理异常,否则必须使用异常
throws
关键词。例子:
public void testDB() throws ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver"); System.out.println("Driver Loaded"); Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/selenium","root","root"); System.out.println("Connected to MySQL DB"); }
我们要么需要使用投掷指定异常列表,要么需要使用
try-catch{}
堵塞。我已经证明了throws
在以下程序中。
未选中的例外: 未选中的例外 未在编译时检查。 Java例外
Error
和RuntimeException
课程是不受限制的例外和其他所有内容 可投掷 被检查。
概括: :如果可以合理地期望客户从异常中恢复,请将其作为检查例外。如果客户无法做任何事情以从异常中恢复,请使其成为未选中的异常。
下图显示了异常类的层次结构。所有异常对象的基类是 java.lang.Throwable
, ,以及它的两个子类 java.lang.Exception
和 java.lang.Error
.
这
Error
类描述内部系统错误(例如VirtualMachineError
,LinkageError
)很少发生。如果发生这样的错误,您几乎无法执行此操作,并且程序将被Java运行时终止。这
Exception
课程描述了您程序引起的错误(例如FileNotFoundException
,IOException
)。这些错误可能会被您的程序捕获和处理(例如,执行替代操作或通过关闭所有文件,网络和数据库连接来进行优雅的退出)。
检查与未选中
如图所示, Error
和 RuntimeException
被称为 未选中 例外。编译器未检查这些例外,因此无需抓或宣布在您的程序中抛出。这是因为对于这些例外,您无能为力。例如,“除以0”触发 ArithmeticException
, ,阵列索引外部触发 ArrayIndexOutOfBoundException
, ,这确实是编程的编程逻辑错误,这些错误应在编译时固定,而不是将其留在运行时例外处理。
所有其他例外被称为 检查 例外。它们由编译器检查,必须被抓或宣布被扔掉。
RuntimeException
而且,编译器未检查其子类,不必在该方法的签名中声明。因此,要小心地使用它们,因为您将不会被告知,并且可能不会意识到使用该方法可能发生的例外(因此没有适当的例外处理代码) - 不良的软件工程实践。
来源是 这里
Exceptions are two types in java:
1. **Checked Exception: The exceptions which are checked by compiler.
例如:我们您正在使用文件执行操作,然后编译器会要求您通过try-catch块或抛出关键字来处理IOException。
2. Unchecked Exception: The exceptions which are not checked by compiler at run time.
例如:如果您在对象上执行操作而不创建该操作;在这种情况下,您将获得NullPoInterException。