为什么NPE可以工作但不是Exception和FileNotFoundException

时间:2016-05-31 14:12:43

标签: java exception nullpointerexception

我已从父级覆盖了一个方法,并在该方法上添加了throws声明。当我添加throws Exceptionthrows FileNotFoundExceprion但与throws NullPointerException合作时,它给了我错误。是什么原因?

class Vehicle {
  public void disp() {
    System.out.println("in Parent");
  }
}

public class Bike extends Vehicle {
  public void disp()throws NullPointerException {
    System.out.println("in Child");
  }

  public static void main(String[] args) {
    Vehicle v = new Bike();
    v.disp();
  }
}

2 个答案:

答案 0 :(得分:1)

NullPointerException是一个所谓的未经检查的异常(因为它扩展了RuntimeException),这意味着你可以将它扔到任何地方而不明确标记该方法“抛出”它。相反,您发布的其他异常是已检查的异常,这意味着必须将该方法声明为“抛出”异常,或者必须在try-catch块中调用有问题的代码。例如:

class Vehicle{
 public void disp() throws Exception {
    System.out.println("in Parent");
 }
}
public class Bike extends Vehicle {
 public void disp() throws Exception {
    System.out.println("in Child");
 }
 public static void main(String[] args) throws Exception {
    Vehicle v = new Bike();
    v.disp();
 }
}

...或:

class Vehicle{
 public void disp() throws Exception {
    System.out.println("in Parent");
 }
}
public class Bike extends Vehicle{
 public void disp() throws Exception {
    System.out.println("in Child");
 }
 public static void main(String[] args) {
    Vehicle v = new Bike();
    try {
      v.disp();
    } catch(Exception exception) {
      // Do something with exception.
    }
 }
}

You can find out more about Java exceptions here.

答案 1 :(得分:0)

从概念上讲,Java中有两种类型的例外:

  • 已检查例外情况
  • 未经检查的例外

这些用于表示不同的事物。已检查的异常是可能发生的特殊情况,您将被迫处理此异常。例如,FileNotFoundException是可能出现的情况(例如,您正在尝试加载尚未存在的文件)。

在这种情况下,这些已检查,因为您的程序应该处理它们。

另一方面,未经检查的异常是在程序执行期间通常不会发生的情况,NullPointerException表示您正在尝试访问null对象,不应该永远不会发生。因此,这些例外情况更可能是软件中可能出现的错误,您不必根据要求声明投掷它们并根据需要处理它们。

通过跟随你的自行车比喻,就像在你的FlatTireException课程上Bike一样。它可能是一个经过检查的例外,因为它可能出现并且应该处理的情况,而WheelMissingException是不应该发生的事情。