Java – 何时是编译器错误,何时是运行时exception?

我目前正在使用Sierra和Bates学习指南学习SCJP认证,并且在许多自我测试(模拟考试问题)中我一直遇到同样的问题 – 我无法判断特定错误是否会在运行时(一个exception)或编译时(编译错误)。 我知道这是一个模糊的问题,可能无法回答,但是,如何在编译或运行时发现错误? 你能给我发一些可以帮助我的网站链接吗?

编译时错误 – java编译器无法编译代码,通常是因为语法错误。 典型候选人:

  • 缺少括号
  • 缺少分号
  • 访问其他类中的私有字段
  • 类路径上缺少类(在编译时)

运行时错误 – 代码确实编译,可以执行但在某些时候崩溃 ,就像你有一个除零。

  • 使用实际为null变量(可能导致NullPointerException)
  • 在数组上使用非法索引
  • 访问当前不可用的资源(丢失文件,…)
  • 类路径上缺少类(在运行时)

(’崩溃’真的不是正确的术语,仅用于说明会发生什么)

对此没有简单的答案; 要查看某些内容是否会编译,您必须完全理解语言规范和所涉及的API。 你基本上必须像编译器一样,没有人能完美地做到这一点。 甚至编译器也不总是完全遵循规范。

Java语言中有许多很多角落的案例。 这就是为什么像Java Puzzlers这样的东西是如此有趣:人们不能总是告诉某些东西是否会编译和/或是否真的,真正发生了什么。

Java语言的一些更复杂的领域是:

  • generics(Eclipse和javac编译器甚至不能就所有内容达成一致)
  • 方法重载分辨率(JLS最难理解的部分之一)

相关问题

  • 1/0是合法的Java表达式吗?
  • javac和Eclipse编译器有什么区别?

基本上,运行时错误是代码中的逻辑错误,即使代码在语法上是正确的。 编译器错误指的是语法/语义中的错误。 如果代码中有编译器错误,程序将永远不会运行(并检查代码的逻辑)。 如果您同时遇到语法和逻辑错误,您将首先得到编译器错误(语法错误),然后当您再次运行代码时,您将收到运行时错误(逻辑错误)。