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

问题描述 投票:0回答:3

我正在阅读有关运行时错误和编译错误的内容

运行时与编译时java编译到底是如何进行的?

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

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

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

public class Try {

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

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

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

因此,只有在执行开始时才会出现编译错误,只有在第二阶段(即将字节码转换为机器码)才会出现运行时错误。

如果我的理解有误请指正...

java compiler-errors jvm
3个回答
1
投票

一个简单的例子:

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

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


1
投票

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

如果您编写的程序从编程语言的角度来看是正确的(因此可以编译),但它做了一些不起作用的事情,例如,就会发生运行时错误尝试将某些内容除以零,或者如果程序厌倦访问仅包含 3 个字符的字符串的第 4 个字符。


1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.