Java-什么时候是编译器错误,什么时候是运行时异常?

Java-什么时候是编译器错误,什么时候是运行时异常?,java,exception,compilation,scjp,Java,Exception,Compilation,Scjp,我目前正在使用Sierra和Bates学习指南学习SCJP认证,在许多自测(模拟考试问题)中,我一直遇到相同的问题-我无法判断特定错误是在运行时(异常)还是在编译时(编译错误)。我知道这是一个有点模糊的问题,可能无法回答,但我如何判断在编译或运行时是否会发现错误?你能给我发一些可能对我有帮助的网站链接吗 这个问题没有简单的答案;要查看是否会编译某些内容,您必须完全理解语言规范和所涉及的API。你必须像一个编译器一样工作,没有人能做到完美。即使是编译器也不总是完全遵循规范 在Java语言中有很多非

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

这个问题没有简单的答案;要查看是否会编译某些内容,您必须完全理解语言规范和所涉及的API。你必须像一个编译器一样工作,没有人能做到完美。即使是编译器也不总是完全遵循规范

在Java语言中有很多非常多的极端情况。这就是为什么像这样的事情如此有趣的原因:人们不能总是判断某个东西是否会编译和/或是否会编译,到底发生了什么

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

  • 泛型(Eclipse和
    javac
    编译器甚至不能在所有方面达成一致)
  • 方法重载解析(JLS中最难理解的部分之一)
相关问题

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

    • 缺少括号
    • 缺少分号
    • 访问其他类中的私有字段
    • 类路径上缺少类(编译时)
    运行时错误-代码已编译,可以执行,但会在某个点崩溃,就像被零除一样

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


    (“崩溃”实际上不是正确的术语,仅用于说明发生了什么)

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

    如果您发布了一些具体问题(以及您自己关于可能答案的推理),我们可以提供更好的帮助。我不确定这个“人工编译器”是否老实说,技能非常有用,超出了对语言和API的一些基本工作理解。几乎可以肯定的是,总会有一个Java代码段,即使James Gosling也无法判断它是否会编译和/或它实际上在做什么。问题是,对于SCJP,您确实需要能够声明是否存在错误(如果有)将在运行时或compile@Peter对不起,我的问题不是很清楚,但有点难以解释。如果您阅读我对Andreas_D答案的评论,我想这可能会让事情更清楚一些。另请参见:,虽然我觉得答案不太清楚,因此无法完全理解,但我感谢您花费的时间和您的兴趣。@Michael:如果您对示例有具体的困惑,如果再问一个问题,我会非常乐意尽我所能详细阐述。看起来您可能对
    instanceof
    何时是编译时错误以及何时抛出
    ClassCastException
    有疑问?四处搜索,可能已经询问/回答了,但无论如何,JLS 15.20.2非常清楚它应该如何运行()谢谢,这个答案非常有用。然而,有时编译器似乎“知道”代码将在运行时崩溃,这是一个编译错误。其他时候,这就像是向编译器“保证”你正在编写的代码能够正常工作——如果不能,代码就会在运行时崩溃。(我想到了引用变量的向下转换)这就是为什么我很难判断它是编译还是运行时。@Michael:我认为答案是,你只需要学习语言和API,至少要到实用的程度。你永远都不会成为一个完美的人工编译器,毕竟这并不是一项非常有用的技能。@Michael-一个突出的错误是无法访问的代码编译时错误。如果您看到一些符合此错误条件的代码,您甚至不会猜测它无法编译;)有一些您必须知道的棘手错误-仅适用于SCJP。在现实生活中,您可以依赖IDE和友好的JVM;-)