为什么引发异常的此方法在调用时不必放在try catch块中?

时间:2019-05-24 16:09:36

标签: java exception try-catch

我调用了引发异常的方法,但是即使本教程说我应该得到一个错误,我也不需要将此方法放在静态void main(String args [])中的try catch块中。为什么是这样?以下是我的代码和本教程的链接。我在本教程的第二个示例中玩转。

https://beginnersbook.com/2013/04/java-throws/?unapproved=133049&moderation-hash=486e9de11daa2c67068e84cdacd88794#comment-133049

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();
    }
}

2 个答案:

答案 0 :(得分:4)

本教程有一个细微的错误:尽管它清楚地指出不需要捕获一种异常,但是它没有注意到在其示例中抛出的异常是 unchecked ,即Runtime种:

  

另一方面,在编译过程中不会检查未经检查的异常(运行时)。 Throws关键字用于处理检查的异常。

ArithmeticException替换为您直接从Exception派生的异常以查看错误。

答案 1 :(得分:2)

在谈论 Java异常 时,仅调用两种主要类型: 已检查的异常 未经检查的异常

受检查的异常 在编译时进行检查:如果您不处理受检查的异常(例如,使用try / catch块或throws关键字) ),编译器将引发错误,换句话说,它将不允许您构建程序,这就是为什么您应始终处理所有检查的异常的原因。

未检查的异常 在运行时已检查:如果不处理这些类型的异常,编译器将不会引发错误。

现在的问题是:我在编码时如何区分这两种类型?

首先应记住,java中的每个异常都应继承自 “ Exception”类

现在,有一种简单的方法可以从已检查的异常中分辨出未检查的异常:从 “ RuntimeException” 继承的任何异常类都被视为 未经检查的异常 ,以及从 “ Exception” 但不是 “ RuntimeException” 继承的任何类em> 被认为是 已检查的异常

在您的情况下 ,您所调用的方法将引发SOLR APIrows, start。但是,这两个异常是从 “ RuntimeException” 继承的。因此,根据上述规则,这两个异常 是未经检查的异常 ,这就是为什么在调用方法ArithmeticException时无需处理它。