7
        System.out.println("First eror ::  without semicolon ") // first Error
        System.Out.println("This second error :: OUT object not used proper :: "); //second error


class TestCompilation
{
    public static void main(String []args)
    {   
        System.out.println("Hello no semicolon::")//First Error 
        System.Out.println("Hello out spell not correctely::"); //Second Error 

        }

}

每当我在cmd中通过JAVAC命令编译上面的代码时,它只给出第一个错误意味着不给出第二个错误。在 java 语言中,部分编译器和部分解释器以及在 java 中第一次编译发生,所以编译器应该列出所有错误,但它只给我一个错误。为什么会这样?我不明白所以请帮我解决这个问题..


我想现在我很清楚我的问题意味着编译器完全可以工作......

为此,我创建了一个简单的示例,它将帮助您了解 java 编译器的工作原理。

class TestCompilation
{
    public static void main(String []args)
    {   
        Syste.out.rintln("Hello");//First Error 
        Syste.Out.rintln("Hello");//Second Error (Not printed at compiler time because it syntatically correct as in compiler first phase)  
        Hitesh542.add(); //there is no such class called Hitesh542.- but compiler thinks that it is right way to call the method. So it passes the first time.
        Hitesh542.add()();//Look out here.. There is a problem, that we can't call a method like this..So it will show the error on first lookup.
        System.otu.println("Hello")//second  Errorasdasdas

        if(); //look this is also an error.- A BASIC syntax error shown at the first lookup.

        try{
            int i = 10 / 0;
        }
        //Third error

        //So bottom line is the JAVA syntatical errors are checked first i.e The SYNTAX of JAVA not the classes or objects.
        //But obv is the first thing is Java Compiler should get the Java class first for compilation on proper path. :)
    }
}
4

3 回答 3

12

我想说这与编译器的工作方式有关:

  1. 执行词法分析,将源代码转换为“令牌”序列。
  2. 代码被解析,编译器检查标记是否符合语言语法。这就是您的第一行将失败的地方:Java 中的每条语句都必须以分号结尾。
  3. 执行语义分析,编译器尝试根据已知符号列表解析变量、方法等 - 在 Java 中,这将大致转换为您的类路径。
  4. 在源语句被翻译成本机字节码或一些中间字节码(后者是 Java 的情况)的地方生成代码。

如果其中一个步骤失败,则该过程必须停止,因为当代码不符合语法时编译器无法执行语义分析。

于 2013-07-31T09:28:08.170 回答
3

在 java 语言中,部分编译器和部分解释器以及在 java 中第一次编译发生,所以编译器应该列出所有错误

很抱歉让你失望了,但这是不合逻辑的。解释器在编译时不存在,与它没有任何关系。

编译器无法一次确定所有错误,例如其中一些错误是无法进行语义分析的语法错误,或者是简单的语义错误会导致进一步分析。

于 2013-07-31T09:42:31.287 回答
1

您的第二个错误是仅在Java 程序中的错误,即符合 Java 语法的字符串。非程序中的非语法错误的概念没有意义。对于编译器,所有语法不正确的字符串都具有相同的含义:无。

就像您提交以下“程序”:

double x = 5.3; x[42] = 0;

并抱怨编译器没有告诉您不能索引双精度值。

例如,在 eclipse 中的 java 源文件中给出这个输入只会给出“标记上的语法错误,删除这些标记”。

于 2013-07-31T10:17:05.017 回答