2014-02-07 109 views
0

我读到有关从需要澄清编译错误和运行时错误

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)如果有任何错误产生,那么这些错误称为编译错误,在此期间检查语法和错字错误。

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

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

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

+1

“仅在执行开始时编译错误” - 否 - 仅在编译时。运行时错误 - 不 - 不转换为机器代码 - 运行程序时出现逻辑错误 – Randy

+0

编译器不仅仅是语法检查。例如,它执行类型检查,因此在执行之前发现许多逻辑错误。 – Ingo

回答

1

一个简单的例子:

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

上面的代码是在语法和类型而言是正确的,则编译器显示没有错误。但是当你用这段代码执行程序(运行程序)时,会有明显的运行时错误。编译器不够聪明来检测这些错误,如果你想在开发周期的早期捕获这些错误(更好的方式是在你的客户端执行该程序之前:P),有静态分析工具或更好的自动测试工具。

+0

运行时错误只发生在我们运行程序时... 哦!不是在这个阶段java 对不起,我不知道这个阶段的名字...... – User27854

+0

也有编译器会给出像这样的结构警告(即做一定量的静态分析),但这是一个好例子。 –

1

没有,典型的Java虚拟机不字节码转换成机器代码。创建的字节码被解释。

如果您编写的程序从编程语言的角度来看是正确的(因此编译),但它做了一些不起作用的运行时错误,例如,试图用零除或者如果程序需要访问只包含3个字符的字符串的第4个字符。

+0

“不,典型的Java虚拟机不会将字节码转换为机器码,所创建的字节码会被解释。” 解释和转换之间的区别是什么.. – User27854

+0

编译器创建“字节码”,它是假想的虚拟机的代码。 JVM可以模拟这台机器(称为“解释”字节码),或者它可以使用即时编译器(JIT)将其转换为本机代码。 –

1

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

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

运行时错误,当你运行该程序时。这是JVM实际上试图执行编译的字节码并遇到问题的时候。字节码没有直接转换成机器码的步骤。字节码由JVM直接解释。正如你所指出的那样,这些问题可能是诸如除零和其他未定义的操作,内存耗尽,或者有时试图将对象转换为非法类型。这些只是例子。任何阻止字节码执行的东西都被认为是运行时错误。

+0

“另外,没有步骤将字节码转换为机器码。” 你打算纠正我说的字节码被解释..正确的! – User27854

+0

@ user2900314。从技术上讲,有些方法可以将字节码转换为机器码,但通常不会使用它们,因为它们消除了使Java非常有用的二进制可移植性。当您运行标准的JVM时,会解释字节码。 –

+0

最后,我还有一个问题给你... 只有当我们运行程序...编译后发生运行时错误,即javac 我们得到一个类文件,并通过使用解释器解释为本地/机器代码(java )是不是这个阶段叫做跑步.. – User27854