【问题标题】:When is it necessary to use "throws" in the method signature?什么时候需要在方法签名中使用“抛出”?
【发布时间】:2018-05-20 12:32:42
【问题描述】:

当我必须使用“throws”关键字时,我并不完全理解。考虑这段代码:

import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {

    public static void otherMethod() throws InputMismatchException {
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        System.out.println(num);
    }

    public static void main (String[] args) {
        try {
            otherMethod();
        } catch(InputMismatchException e) {
            System.out.println("Please input an integer");
        }
    }
}

如果您输入的不是整数,则会导致 InputMismatchException。这个异常被传递给 main 方法。但是,我发现otherMethod()的“throws InputMismatchException”部分根本没有关系,没有它的main方法仍然可以正确处理异常。如果没有这部分,代码将如下所示:

import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {

    public static void otherMethod() {
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        System.out.println(num);
    }

    public static void main (String[] args) {
        try {
            otherMethod();
        } catch(InputMismatchException e) {
            System.out.println("Please input an integer");
        }
    }
}

我想知道何时以及为何使用“throws”关键字,以及它的实际作用。

【问题讨论】:

标签: java exception


【解决方案1】:

InputMismatchException 扩展自 NoSuchElementException,后者扩展自 RuntimeException,并且:

RuntimeException 及其子类是未经检查的异常。 未经检查的异常不需要在方法中声明或 构造函数的 throws 子句,如果它们可以通过执行 方法或构造函数并在方法之外传播或 构造函数边界。

【讨论】:

    【解决方案2】:

    当您知道可能会抛出异常但不想以任何方式处理它时,可以使用 throws 关键字。

    【讨论】:

      【解决方案3】:

      Java中有两种异常:已检查异常和未检查异常。

      检查异常需要程序员在方法签名中显式捕获或声明throws。同时,未检查的异常不需要显式捕获。

      未经检查的异常是RuntimeExceptionError 的子类或子类的异常。检查的异常是剩下的一切。

      您的InputMismatchException 扩展自NoSuchElementException,而NoSuchElementException 扩展自RuntimeException,因此您不需要声明throws 或捕获它。

      【讨论】:

        【解决方案4】:

        Java 有已检查异常和未检查异常。如果可以从方法中抛出未经检查的异常,则不必声明它们。已检查的异常必须被捕获并处理或显式声明为由方法抛出。

        已检查的异常是应该预料到并且能够被处理或从中恢复的异常。未经检查的异常或运行时异常表示您无法预料或无法从中恢复的异常情况。

        来自official docs

        “如果可以合理地期望客户端从异常中恢复, 使其成为已检查的异常。如果客户无法采取任何措施来恢复 从异常中,使其成为未经检查的异常。”

        Java 文档将带您了解 Java 中的类层次结构

        java.lang.Object
          java.lang.Throwable
            java.lang.Exception
              java.lang.RuntimeException
        

        从 RuntimeException 继承的任何异常都是未经检查的异常,但直接从 Exception 继承的异常会被检查。还有Errors略有不同。

        【讨论】:

          猜你喜欢
          • 2015-01-19
          • 1970-01-01
          • 1970-01-01
          • 2012-09-16
          • 2019-08-13
          • 1970-01-01
          • 1970-01-01
          • 2017-06-17
          • 2015-12-02
          相关资源
          最近更新 更多