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

标签 java exception compiler-errors

这个问题在这里已经有了答案:





Java - When is it a compiler error and when is it a runtime exception?

(3 个回答)


7年前关闭。




抱歉英语不好。
显然,除以零总是未定义的。那么为什么这是运行时的异常呢?为什么这不是编译错误?除以零的结论在运行时不变。它与文件未找到异常之类的东西不同,后者将在执行后确定。

        System.out.println(1/0);

另一个例子 :
        Person firstPerson = (Person) new Object();

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

最佳答案

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

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

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

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

关于java - 它们是异常而不是 Java 中的编译错误。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29563131/

相关文章:

java - DoublyLinkedList(普林斯顿版)删除方法如何工作?

java - 比较两个 Date() 的正确方法是什么?

java - setAttribute() 之后 name 属性的设置值中断

java - Java 内连接语句

c++ - 无法构建 lldb - 'atomic' 文件未找到

c - 未处理的异常 (C)

java - 使用 BoofCV 跟踪快速移动的基准点

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

java异常捕获与抛出不同的类

java - 为什么 Java 中的加号运算符总是产生 Integer?