我研究过然而,对于未检查的异常,编译器不会强制客户端程序员捕捉异常或在throws子句中声明异常。事实上,客户端程序员甚至可能不知道异常可能会被抛出。例如,StringIndexOutOfBoundsException由String的charAt()方法抛出。什么意思?根据这段代码,没有必要在代码中放置try catch块,但我看到编译器强制将代码放在try catch块中。我很困惑他们到底是什么?
StringIndexOutOfBoundsException
charAt()
8yparm6h1#
未检查的异常是那些扩展RuntimeException类的异常。编译器不会强制您捕获此类异常或强制您在方法中使用throws关键字声明它。所有其他异常类型(不扩展RuntimeException)都被检查,因此必须声明为抛出和/或捕获。当你希望你的方法的调用者(即你的API的用户)在你的API中显式地处理异常情况时,使用检查异常。当你相信调用能够对异常情况做一些有意义的事情时,就声明检查异常,比如重试调用,回滚更改或将其转换为一些用户可读的错误消息。如果您认为调用对异常没有任何用处(特别是当它代表一个bug或API的错误使用时),那么应该取消检查异常。此外,具有太多检查异常的API可能会令人讨厌(例如,尝试使用java reflection API=)
RuntimeException
throws
hxzsmxv22#
IOException
null
NullPointerException
dm7nw8vv3#
你的问题到底是什么?编译器不应该(也不会)强迫你去尝试/捕捉未经检查的异常,那将违背它们的本质。一般的想法是,检查异常是你可以预见的,但可能是基于你无法控制的输入,你必须处理。未检查异常通常代表程序中的错误。有很多人认为检查异常在Java平台中是一个错误,他们很少使用或根本不使用它们。
2izufjch4#
这是因为,1.检查异常不是程序员的错误造成的,相反,它们是我们(程序员)不期望做太多事情的严重后果。1.在未检查异常的情况下,它是由于程序员的错误而产生的异常,通常可以由程序员自己解决。检查以下链接:Why RunTime Exceptions are unchecked ?Checked vs Unchecked Exception ?
f8rj6qna5#
所有异常都是运行时的一部分,而不是编译时的一部分。有两种异常:检查异常和未检查异常。检查异常的例子是IO异常,ClassNotFound异常,未检查异常的例子是运行时异常。在检查异常的情况下,错误或警告消息在编译时出现,以便用户在运行时通过使用throws关键字来处理它。它用于将异常抛出到默认的catch机制系统中。但是在未检查异常的情况下,编译时不会有警告。
gdrx4gfi6#
在编写代码时需要检查、处理或应该注意的异常称为检查异常。例如:1.我们有FileNotFoundException --〉,当我们编写一些与文件类相关的代码时,会发生这个异常。在这种情况下,为了处理它们,我们必须处理这些异常。2.另一个例子是ParseException,当我们处理日期函数时,会发生这个异常。
这些是在编码过程中可选处理的异常。是否处理它们取决于我们。如果我们未能处理它们,则有可能在执行过程中出现运行时错误。例如:我们有NullPointerException,ArithemeticException,NosSuchElementFoundException等等。这些就像是可选的东西,我们甚至不需要处理它们。甚至jvm或编译器也不会建议我们处理它们。**
wko9yo5t7#
简单地说,
*检查异常是那些可以并且应该由你的代码处理的异常(因此编译器会强制你处理它们)*unchecked exceptions是那些超出程序员控制的异常(因此编译器不会强制您处理它们)。
即使在创建自定义异常时也使用相同的规则。
7条答案
按热度按时间8yparm6h1#
未检查的异常是那些扩展
RuntimeException
类的异常。编译器不会强制您捕获此类异常或强制您在方法中使用throws
关键字声明它。所有其他异常类型(不扩展RuntimeException
)都被检查,因此必须声明为抛出和/或捕获。当你希望你的方法的调用者(即你的API的用户)在你的API中显式地处理异常情况时,使用检查异常。当你相信调用能够对异常情况做一些有意义的事情时,就声明检查异常,比如重试调用,回滚更改或将其转换为一些用户可读的错误消息。
如果您认为调用对异常没有任何用处(特别是当它代表一个bug或API的错误使用时),那么应该取消检查异常。此外,具有太多检查异常的API可能会令人讨厌(例如,尝试使用java reflection API=)
hxzsmxv22#
IOException
。即使程序没有任何错误,这些异常也会发生。因此,有必要告诉程序如何处理异常。null
对象上读取值时会引发NullPointerException
。因此,未检查的异常表示需要程序员手动修复的问题。为了避免错误行为,程序崩溃是合理的。因此不需要try-catch块(但是为了提供缓解,例如向用户显示错误,可能需要try-catch块)。dm7nw8vv3#
你的问题到底是什么?编译器不应该(也不会)强迫你去尝试/捕捉未经检查的异常,那将违背它们的本质。
一般的想法是,检查异常是你可以预见的,但可能是基于你无法控制的输入,你必须处理。未检查异常通常代表程序中的错误。
有很多人认为检查异常在Java平台中是一个错误,他们很少使用或根本不使用它们。
2izufjch4#
这是因为,
1.检查异常不是程序员的错误造成的,相反,它们是我们(程序员)不期望做太多事情的严重后果。
1.在未检查异常的情况下,它是由于程序员的错误而产生的异常,通常可以由程序员自己解决。
检查以下链接:
Why RunTime Exceptions are unchecked ?
Checked vs Unchecked Exception ?
f8rj6qna5#
所有异常都是运行时的一部分,而不是编译时的一部分。有两种异常:检查异常和未检查异常。检查异常的例子是IO异常,ClassNotFound异常,未检查异常的例子是运行时异常。在检查异常的情况下,错误或警告消息在编译时出现,以便用户在运行时通过使用throws关键字来处理它。它用于将异常抛出到默认的catch机制系统中。但是在未检查异常的情况下,编译时不会有警告。
gdrx4gfi6#
**检查异常
在编写代码时需要检查、处理或应该注意的异常称为检查异常。例如:1.我们有FileNotFoundException --〉,当我们编写一些与文件类相关的代码时,会发生这个异常。在这种情况下,为了处理它们,我们必须处理这些异常。2.另一个例子是ParseException,当我们处理日期函数时,会发生这个异常。
未检查异常
这些是在编码过程中可选处理的异常。是否处理它们取决于我们。如果我们未能处理它们,则有可能在执行过程中出现运行时错误。例如:我们有NullPointerException,ArithemeticException,NosSuchElementFoundException等等。这些就像是可选的东西,我们甚至不需要处理它们。甚至jvm或编译器也不会建议我们处理它们。**
wko9yo5t7#
简单地说,
*检查异常是那些可以并且应该由你的代码处理的异常(因此编译器会强制你处理它们)
*unchecked exceptions是那些超出程序员控制的异常(因此编译器不会强制您处理它们)。
即使在创建自定义异常时也使用相同的规则。