什么时候需要使用" throws"在方法签名中?

时间:2018-05-20 12:32:43

标签: java exception

当我不得不使用" 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方法。但是,我发现"抛出InputMismatchException" otherMethod()的一部分根本不重要,没有它的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");
        }
    }
}

我想知道何时以及为什么"抛出"使用关键字,以及实际执行的操作。

4 个答案:

答案 0 :(得分:3)

InputMismatchExceptionNoSuchElementException延伸,从RuntimeException延伸,并且:

  

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

Java检查了异常并取消选中了异常。如果可以从方法中抛出未经检查的异常,则不必声明它们。必须捕获并处理或明确声明由方法抛出已检查的异常。

已检查的例外情况应该是预期的,并且能够处理或从中恢复。未经检查或运行时异常表示您预计不会预期或无法恢复的特殊情况。

来自official docs

  

"如果可以合理地期望客户从异常中恢复,   使它成为检查异常。如果客户端无法做任何事情来恢复   从异常中,将其作为未经检查的例外。"

java文档将引导您完成Java中的类层次结构

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

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

答案 3 :(得分:0)

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

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

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

您的InputMismatchException来自NoSuchElementExceptionNoSuchElementException来自RuntimeException,因此您无需声明throws或抓住它。