它们是Java中的异常而不是编译错误。为什么?

时间:2015-04-10 13:46:52

标签: java exception compiler-errors

抱歉英语不好 显然,除以零始终是不确定的。那么为什么在运行时这是一个例外?为什么那不是编译错误?除零的结论在运行时没有改变。它与文件未找到异常之类的内容不同,后者将在执行后确定。

        System.out.println(1/0);

另一个例子:

        Person firstPerson = (Person) new Object();

编译器允许子进程转换父进程,但它在运行时抛出异常。

2 个答案:

答案 0 :(得分:0)

编译器通常只检查语法错误,而不检查语义错误。这些都是语义错误。两种代码行的语法都很好。您将两个整数分开,并将对象强制转换为另一个类型。两者都是语法层面的有效操作。实际错误是由语义引起的(不能除以0 /您尝试转换的对象不是Person子类型的实例)。并考虑以下代码:

class AnObject{
     public AnObject(){
          divide7(0);
     }

     public int divide7(int i){
          return (7 / i);
     }
}

它将7除以0,但如果这是编译时错误,编译器将会非常低效,因为它们必须每次检查完整的代码(每个路径)。有时输入是未知的(例如来自服务器/用户的输入)。

答案 1 :(得分:0)

编译器不会经常检查程序中的异常。这通常是因为程序员会知道他们的程序会抛出的任何异常(例如调用一个未定义的项并获得一个抛出的NullPointerException / IOException,他们应该捕获它们以保持程序运行)