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

Zoe*_*Zoe 0 java exception throws

在以下示例中,Eclipse不要求我添加“ throws EmptyStackException”

public E pop() {
  if (stack.isEmpty()) {
    throw new EmptyStackException();
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

public E pop() throws Exception {
  if(stack.isEmpty()) {
    throw new Exception();
...
}
Run Code Online (Sandbox Code Playgroud)

关于何时应该添加引发的任何特定规则?

Mak*_*oto 5

这是已检查的异常检查的异常之间的区别。

检查的异常是方法签名的一部分,使用该方法时,必须将其捕获或声明为抛出异常。它们是它们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();
    }
}
Run Code Online (Sandbox Code Playgroud)

一个未经检查的异常不是方法签名的一部分,并且可能会抛出什么特别的原因。它们是的子类RuntimeException

您将遇到的最常见的情况之一是NullPointerException。此特定异常可能以最无害的方式发生,例如:

Integer i = null;

System.out.println(i + 2); // NPE on unboxing
Run Code Online (Sandbox Code Playgroud)

通常不期望人们能够从异常中恢复;用外行的话来说,关于代码流的假设出了点问题。也就是说,编写此代码几乎肯定是一种代码味道:

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

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

还有Error,这是未检查的异常的特例-您绝对不应该从中恢复,因为这表明JVM发生了非常严重的错误。

例如,您不希望看到以下内容:

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