有人告诉我,在Java中,未检查异常可以在try块捕获,但如果它抓住了,是不是叫checked异常?
Answer 1:
unchecked异常是不需要在被捕获的异常try
- catch
块。 未选中的例外是的子类RuntimeException
或Error
类。
checked异常是需要在被捕获的异常try
- catch
块。
检查和unchecked异常的定义可参见第11.2节:编译时检查异常的Java语言规范 :
该unchecked异常类是类
RuntimeException
和它的子类,类Error
和它的子类。 所有其他异常类被检查的异常类。
仅仅因为一个未经检查的异常被捕获在catch
块不让它检查异常-它只是意味着在未经检查的异常被抓获,并在被处理catch
块。
人们可以catch
一个unchecked异常,然后throw
一个新的检查异常,所以任何调用在其中一个未经检查的异常可能发生,迫使调用它来处理某种异常的方法,该方法的方法。
例如,一个NumberFormatException
可以处理一些不可分析时抛出String
到Integer.parseInt
方法是一个未经检查的异常,所以它不需要被抓获。 但是,调用该方法的方法可能需要调用程序,妥善处理这样的问题,所以它可能会引发其被选中另一个异常(不是的子类RuntimeException
。):
public int getIntegerFromInput(String s) throws BadInputException {
int i = 0;
try {
i = Integer.parseInt(s);
catch (NumberFormatException e) {
throw new BadInputException();
}
return i;
}
在上面的例子,一个NumberFormatException
被捕获在try
- catch
块,和一个新的BadInputException
(其旨在是检查异常)被抛出。
任何来电者的getIntegerFromInput
方法将被迫搭上BadInputException
,并不得不面对糟糕的输入。 如果NumberFormatException
是不被捕获和处理,任何呼叫者这种方法必须正确处理异常。
(此外,应该注意的是,吃了一个例外,做的事情是不是真的有意义不被认为是一个很好的做法 - 处理情况可以进行有意义的异常处理例外)
从Java教程:
- 教训:异常
- 渔获或指定要求 -讨论检查的异常。
- 链式例外 -捕获异常和投掷一个新的,如上面的例子中的做法。
- unchecked异常-争
Answer 2:
不,这不叫,只是因为它是抓检查异常。 catch块可写入捕捉任何一种异常或错误的。 经过例外是那些受捕捉或指定的要求 ,这意味着你必须要么赶上他们或声明的方法可能引发它们。 你可以认为术语检查作为这意味着编译器会检查,以确保你坚持抓或指定要求的。 错误和RuntimeExceptions被称为unchecked异常,因为编译器不强制对他们的这一要求。
Answer 3:
我认为区别在于,编译器会标志未捕获的checked异常,并抛出检查异常,但没有在编译时间的方法签名声明它们的方法。
unchecked异常不需要声明或捕捉,但也被禁止。 编译器只是不将其识别为错误。