当前位置: 首页 > 知识库问答 >
问题:

为什么这个抛出异常的方法在调用时不必位于try-catch块中?

赵雅懿
2023-03-14

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

https://beginnersbook.com/2013/04/java-throws/?unapproved=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个答案

董品
2023-03-14

当谈到Java中的异常时,只调用了两种主要类型:已检查的异常和未检查的异常。

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

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

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

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

现在,有一种简单的方法可以区分未检查的异常和已检查的异常:从“RuntimeException”继承的任何异常类都被视为未检查的异常,而从“exception”继承而非“RuntimeException”的任何类都被视为已检查的异常。

在您的情况下,您调用的方法会抛出一个算术异常和一个NullPointerException。但这两个异常继承了“RuntimeException”。因此,根据上面写的规则,这两个异常是未检查的异常,这就是为什么在调用方法时不需要处理它。

陆英毅
2023-03-14

教程有一个微妙的错误:虽然它明确指出有一种异常不需要被捕获,但它没有注意到在它们自己的示例中抛出的异常是未经检查的,即Runtime品种:

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

用直接从异常派生的异常替换算术异常以查看错误。

 类似资料:
  • 我一直在收到com。谷歌。格森。JsonSyntaxException无法调用Gson。fromJson(),因此添加了一个捕获(异常)逻辑,但错误永远不会被捕获,而只是被抛出! 这是我所拥有的: 运行测试时,我得到“com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:应为BEGIN\u对象,但在第1行第1列路径$

  • 在try块中为未抛出异常子类的方法捕获异常,将无法编译。当我捕捉到异常时,它起作用了。它是如何工作的??

  • 我有一个实现以下接口的基类,上面声明的方法抛出基本异常类型。 有许多具体的类扩展了基类,我不想在所有这些类中添加块。有没有一种方法可以处理而不添加? 接口 基层 混凝土类示例(共30个)

  • 当我在node中创建一个异步函数并使用await时,我正在使执行等待一个承诺解析(可以是一个解析或一个拒绝),我所做的是在try/catch块中放入一个await承诺,并在承诺拒绝的情况下抛出一个错误。问题是,当我在try/catch块内调用这个异步函数来捕获错误时,我会得到一个UnhandledPromiserEjectionWarning。但是使用await的全部意义并不是等待承诺解决并返回它

  • 下面是我的代码。当我运行它时,我在线程“main”java.lang.IndexOutOfBoundsException:Index:3、Size:2中得到异常,而不是我的异常消息。谁能解释一下我做错了什么,为什么会这样?谢谢!

  • 问题内容: 我们知道捕获异常非常昂贵。但是,即使从不抛出异常,在Java中使用try-catch块是否也很昂贵? 问题答案: 几乎没有任何花销。代码的元数据不是在运行时进行设置,而是在编译时进行结构化,这样,当引发异常时,它现在执行相对昂贵的操作,即遍历堆栈并查看是否存在任何可捕获此异常的块。例外。从外行的角度来看,它可能也是自由的。它实际上是在抛出导致你付出代价的异常-但是,除非你抛出数百或数千