簡體   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