[英]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; 必須被抓住或宣布被拋出
我的問題:
它只是編譯器檢查源的順序。 特別是,在檢查調用可以引發已檢查異常的方法的代碼之前,編譯器會檢查導入並解析它們。
如果使用-verbose
運行javac
,您會注意到編譯器加載了導入的類,在本例中為BufferedReader
和InputStreamReader
,然后它加載了像Object
和String
這樣的公共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.