25

我从来没有使用过“throws”子句,今天有位朋友告诉我,我必须在方法声明中指定该方法可能抛出的异常。但是,我一直在使用异常而没有问题,那么,如果实际上需要它,为什么需要它呢?

4

6 回答 6

27

Java 有两种不同类型的异常:已检查异常和未检查异常。

未经检查的异常是的子类,RuntimeException您不必添加 throws 声明。所有其他异常都必须在方法体中处理,要么使用 try/catch 语句,要么使用 throws 声明。

未经检查的异常示例:IllegalArgumentException有时用于通知已使用非法参数调用了方法。不需要投掷。

检查异常的示例:包IOException中的某些方法java.io可能会抛出。使用 try/catch 或添加throws IOException到方法声明并将异常处理委托给方法调用者。

于 2011-02-03T18:03:58.770 回答
14

如果使用 throws 关键字声明方法,则任何其他希望调用该方法的方法必须准备好捕获它或声明其自身将引发异常。

例如,如果您想暂停应用程序,您必须调用Thread.sleep(milliseconds);

但是这个方法的声明说它会抛出一个InterruptedException

宣言:

public static void sleep(long millis) throws InterruptedException

所以如果你想在你的 main 方法中调用它,你必须要么抓住它:

public static void main(String args[]) {
    try {
        Thread.sleep(1000);
    } catch(InterruptedException ie) {
        System.out.println("Opps!");
    }
}

或者使该方法也声明它正在抛出异常:

public static void main(String args[]) throws InterruptedException {
    Thread.sleep(1000);
}
于 2011-02-03T18:04:04.657 回答
7

即使有已检查的异常,它也可能发生。有时它会破坏日志记录。

假设一个库方法使用这个技巧来允许一个Runnable可以 throw的实现IOException

class SneakyThrowTask implements Runnable {

    public void run() {
        throwSneakily(new IOException());
    }

    private static RuntimeException throwSneakily(Throwable ex) {
        return unsafeCastAndRethrow(ex);
    }

    @SuppressWarnings("unchecked")
    private static <X extends Throwable>X unsafeCastAndRethrow(Throwable ex) throws X {
        throw (X) ex;
    }

}

你这样称呼它:

public static void main(String[] args) {
    try {
        new SneakyThrowTask().run();
    } catch (RuntimeException ex) {
        LOGGER.log(ex);
    }
}

永远不会记录异常。而且因为它是一个已检查的异常,所以你不能这样写:

public static void main(String[] args) {
    try {
        new SneakyThrowTask().run();
    } catch (RuntimeException ex) {
        LOGGER.log(ex);
    } catch (IOException ex) {
        LOGGER.log(ex); // Error: unreachable code
    }
}
于 2011-02-03T19:04:13.460 回答
4
  1. 您需要声明您的方法抛出的检查异常。
  2. 如果您声明“抛出异常”,它几乎涵盖了大多数(如果不是全部)检查的异常
  3. 您始终可以抛出未经检查的运行时异常,而不必声明。

我很确定如果您尝试抛出已检查的异常,并且没有将方法声明为抛出该类型,代码甚至不会编译(现在检查)。

编辑,对,如果你尝试一些简单的事情,比如

public static void main(String[] args) {
   throw new Exception("bad");
}

你得到一个编译错误。

特别针对您的问题,如果您调用声明为抛出异常的方法,则必须尝试/捕获方法调用,或声明您的方法抛出异常。

于 2011-02-03T17:55:00.643 回答
3

throws关键字用于向另一个方法抛出异常。

它简化了对用户的处理异常。因为这样所有的异常都可以在用于运行的方法中处理。

大多数情况下,它主要是一个方法,因此用户不需要在方法内部进行探索。

它还向编译器抛出关键字 force 以处理可能发生的异常。

如果您是 API 开发人员,在编写代码时,您可能会看到可能会发生异常,因此您throws在方法运行时使用关键字来处理它。

于 2018-06-23T01:48:06.243 回答
2

Java 抛出关键字,

  • Javathrows关键字用于声明异常。
  • throws紧随其后的是班级。
  • 已检查的异常可以使用 传播throws
  • 它向方法的调用者提供有关异常的信息。

throws例子,

void m()throws ArithmeticException{  
    //method code  
}  
于 2018-06-25T07:30:35.083 回答