System.out.println(1/0);
另一个例子:
Person firstPerson = (Person) new Object();
编译器允许子进程转换父进程,但它在运行时抛出异常。
答案 0 :(得分:0)
编译器通常只检查语法错误,而不检查语义错误。这些都是语义错误。两种代码行的语法都很好。您将两个整数分开,并将对象强制转换为另一个类型。两者都是语法层面的有效操作。实际错误是由语义引起的(不能除以0 /您尝试转换的对象不是Person
子类型的实例)。并考虑以下代码:
class AnObject{
public AnObject(){
divide7(0);
}
public int divide7(int i){
return (7 / i);
}
}
它将7除以0,但如果这是编译时错误,编译器将会非常低效,因为它们必须每次检查完整的代码(每个路径)。有时输入是未知的(例如来自服务器/用户的输入)。
答案 1 :(得分:0)
编译器不会经常检查程序中的异常。这通常是因为程序员会知道他们的程序会抛出的任何异常(例如调用一个未定义的项并获得一个抛出的NullPointerException / IOException,他们应该捕获它们以保持程序运行)