繁体   English   中英

java编译中出现意外的错误顺序

[英]Unexpected order of errors in java compilation

在线解决挑战时,我发现了java的以下行为,我发现它有点奇怪。 我从以下大纲编写程序开始:

import java.io.*;

class WeirdJava
{
    public static void main (String[] args) 
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();
        HashMap<Integer, Integer> map = new HashMap<Integer,Integer>();
        System.out.println("Weird Java");
    }
}

请注意,在上面的程序中,有两个错误:

  • 我没有处理BufferedReader可能抛出的异常。
  • 我没有导入包含HashMap标准util库。

现在,当我尝试编译上面的程序时,java编译器给出了它无法找到符号HashMap的错误。 请注意,涉及HashMap的声明位于BufferedReader之后。 接下来,我将以下import语句添加到程序中:

import java.util.HashMap;

当我再次编译程序时,这次编译器显示错误

未报告的异常IOException; 必须被抓住或宣布被抛出

我的问题:

  1. 为什么在先前的编译尝试中没有抛出此错误?
  2. 编译错误的顺序似乎并不自然。 在这个例程中,编译器设计原则是什么?

它只是编译器检查源的顺序。 特别是,在检查调用可以引发已检查异常的方法的代码之前,编译器会检查导入并解析它们。

如果使用-verbose运行javac ,您会注意到编译器加载了导入的类,在本例中为BufferedReaderInputStreamReader ,然后它加载了像ObjectString这样的公共API类:

[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/io/BufferedReader.class)]]
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/io/InputStreamReader.class)]
]    
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Object.class)]]
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/lang/String.class)]]
[checking test.Test]
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/lang/AutoCloseable.class)]]
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/lang/System.class)]]
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/io/InputStream.class)]]
[loading ZipFileIndexFileObject[C:\Dev\Java\jdk1.7.0_75\lib\ct.sym(META-INF/sym/rt.jar/java/io/Reader.class)]]
Test.java:11: error: cannot find symbol
    HashMap<Integer, Integer> map = new HashMap<Integer,Integer>();

通过查看此链接中的概述,加载已使用的类本身是第一阶段编译的一部分,称为“Parse and Enter”:

每个树都传递给Enter,它输入符号中遇到的所有定义的符号。 这必须在分析可能引用这些符号的树之前完成。 此阶段的输出是待办事项列表,其中包含需要分析并生成类文件的树。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM