需要澄清编译错误和运行时错误

时间:2014-02-07 15:59:05

标签: java compiler-construction compiler-errors jvm

我正在阅读

中的运行时错误和编译错误

Runtime vs Compile timeHow exactly does java compilation take place?

我可以推断,在编译期间,编译器不会检查逻辑,而只检查语法和拼写错误以及在运行时检查逻辑的位置以及如何实现这些逻辑等等。比如除零,记忆不够。

因此,如果我的理解是正确的,那么只有在编译阶段才会出现编译错误,并且只在执行程序时出现运行时错误..

例如,让我考虑一个简单的程序

public class Try {

public static void main(String[] args) {
    System.out.println("My first program");
    }
}

现在当我在这个阶段编译(即javac)时,如果产生任何错误,那么这些错误称为编译错误,在此期间检查语法和拼写错误。

并且在将字节代码转换为本机/机器代码(例如java)的过程中产生的错误称为运行时错误,在此期间检查程序逻辑。

因此,只有在第二阶段(即将字节代码转换为机器代码)才能在执行开始时产生编译错误并且运行时错误。

如果我的理解错误,请纠正我......

3 个答案:

答案 0 :(得分:1)

不,典型的Java虚拟机不会将字节代码转换为机器代码。解释创建的字节代码。

如果您编写的程序是从编程语言正确的(并因此编译)开始的,那么会发生运行时错误,但它会执行一些不起作用的程序,例如:尝试将某些内容除以零,或者如果程序需要访问仅包含3个字符的字符串的第4个字符。

答案 1 :(得分:1)

你的理解是错误的,但不是很多。错误的名称几乎表明了它们的性质。

编译代码时发生编译时错误。编译意味着将文本转换为字节码。这意味着您的java代码无法转换为字节码。编译时错误通常会检查语法,尽管Java编译器也会进行一些非常基本的逻辑检查。例如,它不允许您使用无法访问的语句编译代码。

运行程序时发生运行时错误。这是当JVM实际上尝试执行编译的字节码并遇到问题时。没有将字节码直接转换为机器代码的步骤。字节码直接由JVM解释。正如您所指出的,这些问题可能是除零和其他未定义的操作,内存不足或有时尝试将对象转换为非法类型之类的问题。这些只是一些例子。阻止字节码执行的任何内容都被视为运行时错误。

答案 2 :(得分:1)

一个简单的例子:

String myString = null;
myString.substring(..)

上面的代码在语法和类型方面是正确的,编译器没有显示错误。但是当您使用此代码执行程序(运行程序)时,会出现明显的运行时错误。如果您想在开发周期的早期捕获这些错误(在客户端执行程序之前更好:P),编译器不够智能,无法检测到这些错误。有静态分析工具或更好的自动测试等工具。