Beim Lösen einer Herausforderung online beobachtete ich das folgende Verhalten von Java, das ich ein wenig seltsam fand. Ich begann mit der Zusammenstellung eines Programms entlang nach folgendem Schema ab:Unerwartete Reihenfolge der Fehler in Java-Kompilierung
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");
}
}
Beachten Sie, dass in dem obigen Programm gibt es zwei Fehler:
- Ich habe nicht behandelt Ausnahmen, die von
BufferedReader
geworfen werden könnten. - Ich habe keine Standard-
util
-Bibliothek importiert, dieHashMap
enthält.
Nun, wenn ich versuche, das obige Programm zu kompilieren, der Java-Compiler gibt den Fehler, dass es nicht Symbol HashMap
finden. Beachten Sie, dass die Deklaration mit HashMap
nach BufferedReader
erfolgt. Als nächstes füge ich hinzu, um das Programm die folgenden Import-Anweisung:
import java.util.HashMap;
Wenn ich das Programm wieder zu kompilieren, diesmal der Compiler zeigt Fehler
nicht gemeldet Ausnahme IOException; müssen gefangen oder deklariert werden zu geworfen
Meine Fragen:
- Warum ist dieser Fehler nicht in der vorherigen Kompilation Versuch geworfen?
- Die Reihenfolge, in der Kompilierungsfehler auftreten, scheint nicht natürlich zu sein. Was sind die Compiler Design-Prinzipien, die während dieser Routine ins Spiel kommen?
Warum sagt der Compiler nicht über die nicht abgefangene Ausnahme in diesem Durchlauf selbst? – Bhoot
@Bhoot Der einzige Grund, an den ich denken konnte, ist, dass es die Phase der Überprüfung nicht abgefangener Ausnahmen noch nicht erreicht hat. Es kam sofort zurück, als es die Typen ohne Importe traf. – manouti
Ich stimme diesem Grund nicht zu, aber es scheint unnatürlich.Ich werde jede Literatur zu schätzen wissen, die dieses Thema (oder irgendetwas damit verbunden) anspricht. – Bhoot