在网上解决挑战时,我发现了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
可能引发的异常。util
的标准HashMap
库。现在,当我尝试编译上面的程序时,java编译器会给出错误,它找不到符号HashMap
。请注意,涉及HashMap
的声明位于BufferedReader
之后。接下来,我将以下import语句添加到程序中:
import java.util.HashMap;
当我再次编译程序时,这次编译器显示错误
未报告的异常IOException;必须被抓住或宣布为 抛出
我的问题:
答案 0 :(得分:4)
它只是编译器检查源的顺序。特别是,在检查调用可能引发已检查异常的方法的代码之前,编译器会检查导入并解析它们。
如果您使用javac
运行-verbose
,您会注意到编译器会加载导入的类,在本例中为BufferedReader
和InputStreamReader
,然后它会加载公共API类,例如Object
和String
:
[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>();
通过查看this link中的概述,加载已使用的类本身是第一阶段编译的一部分,名为&#34; Parse and Enter&#34;:
每个树都传递给Enter,它输入符号中遇到的所有定义的符号。这必须在分析可能引用这些符号的树之前完成。此阶段的输出是待办事项列表,其中包含需要分析并生成类文件的树。