我调用了引发异常的方法,但是即使本教程说我应该得到一个错误,我也不需要将此方法放在静态void main(String args [])中的try catch块中。为什么是这样?以下是我的代码和本教程的链接。我在本教程的第二个示例中玩转。
public class Sample2 {
static void myMethod() throws ArithmeticException, NullPointerException {
System.out.println("myMethod has been successfully called");
throw new ArithmeticException("Arithmetic Expression has been thrown");
}
public static void main(String args[]) {
myMethod();
}
}
答案 0 :(得分:4)
本教程有一个细微的错误:尽管它清楚地指出不需要捕获一种异常,但是它没有注意到在其示例中抛出的异常是 unchecked ,即Runtime
种:
另一方面,在编译过程中不会检查未经检查的异常(运行时)。 Throws关键字用于处理检查的异常。
将ArithmeticException
替换为您直接从Exception
派生的异常以查看错误。
答案 1 :(得分:2)
在谈论 Java异常 时,仅调用两种主要类型: 已检查的异常 和 未经检查的异常 。
受检查的异常 在编译时进行检查:如果您不处理受检查的异常(例如,使用try / catch块或throws关键字) ),编译器将引发错误,换句话说,它将不允许您构建程序,这就是为什么您应始终处理所有检查的异常的原因。
未检查的异常 在运行时已检查:如果不处理这些类型的异常,编译器将不会引发错误。
现在的问题是:我在编码时如何区分这两种类型?
首先应记住,java中的每个异常都应继承自 “ Exception”类 。
现在,有一种简单的方法可以从已检查的异常中分辨出未检查的异常:从 “ RuntimeException” 继承的任何异常类都被视为 未经检查的异常 ,以及从 “ Exception” 但不是 “ RuntimeException” 继承的任何类em> 被认为是 已检查的异常 。
在您的情况下 ,您所调用的方法将引发SOLR API
和rows, start
。但是,这两个异常是从 “ RuntimeException” 继承的。因此,根据上述规则,这两个异常 是未经检查的异常 ,这就是为什么在调用方法ArithmeticException
时无需处理它。