什么时候需要在Java中添加throws?

时间:2014-03-16 17:49:20

标签: java exception throws

在下面的示例中,Eclipse不要求我添加'throws EmptyStackException'

public E pop() {
  if (stack.isEmpty()) {
    throw new EmptyStackException();
  }
  ...
}

但是,在以下示例中,“throws Exception”是必需的

public E pop() throws Exception {
  if(stack.isEmpty()) {
    throw new Exception();
...
}

是否有任何特定的规则我应该何时添加投掷?

3 个答案:

答案 0 :(得分:5)

这是checked exceptionsunchecked exceptions之间的区别。

已检查的异常是方法签名的一部分,并且在使用该方法时需要捕获或声明要抛出。它们是Exception自己的子类。

某些示例包含Scanner的特定构造函数,或者更正式的Scanner#<init>(File file)

通常会抛出已检查的异常,因为可以从异常中恢复。例如,如果您要创建一个Scanner来读取文件中的行,并且该文件不存在,除了要求他们重新指定位置之外,您还能合理地做些什么?

一个例子:

Scanner sc = new Scanner(System.in);
boolean found = false;
String path = sc.nextLine();
while(!found) {
    try {
        sc = new Scanner(new File(path));
        found = true;
    } catch (FileNotFoundException e) {
        System.out.println(path + " was not valid.  Please try again.");
        path = sc.nextLine();
    }
}

未经检查的异常方法签名的一部分,可能因任何特殊原因而被抛出。它们是RuntimeException的子类。

您遇到的最常见的一个问题是NullPointerException。这种特殊的例外可能以最无害的方式发生,例如:

Integer i = null;

System.out.println(i + 2); // NPE on unboxing

通常不希望一个人能够从异常中恢复;在外行人的术语中,对代码流的假设出了问题。也就是说,写这个几乎当然代码味道:

Integer i = null;
try {
    System.out.println(i + 2);
} catch(NullPointerException e) {
    System.out.println("i was null!?");
}

大多数现代框架允许您指定应用程序在发生此类错误时输入的特定状态 - 如果它是Web驱动的应用程序,您可以将这些类型的运行时异常处理为500。

还有Error,这是未经检查的例外情况的一个特例 - 您应该绝对不会从中恢复,因为它表明事情已经非常糟糕,非常糟糕JVM出错了。

例如,这是您不想看到的内容:

public void recurse() {
    try {
        recurse();
    } catch (StackOverflowError e) {
        System.out.println("We went in too deep.");
    }
}

答案 1 :(得分:2)

您不需要在方法签名中声明/处理RuntimeException,但是,如果方法抛出并且未在方法内处理,则必须声明/处理Checked Exception。

在您的情况下,EmptyStackExceptionRuntimeException,因此,您不需要在方法中处理/声明它,但Exception是经过检查的,所以,你必须要么处理它,要么在方法签名中声明它

答案 2 :(得分:2)

EmptyStackException扩展RuntimeException这是一个未经检查的例外,而Exception是一个已检查的例外。

Java只需要您捕获已检查的异常。您可以详细了解hereherehere