Durante la risoluzione di una sfida online, ho osservato il seguente comportamento di java che ho trovato un po 'strano. Ho cominciato compilando un programma lungo il seguente schema:Ordine imprevisto di errori nella compilazione 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");
}
}
Si noti che nel programma di cui sopra, ci sono due errori:
eccezioni- non ho trattati che potrebbero essere scagliati dal
BufferedReader
. - Non ho importato la libreria standard
util
che contieneHashMap
.
Ora, quando provo a compilare il programma di cui sopra, il compilatore java dà l'errore che non riesce a trovare il simbolo HashMap
. Si noti che la dichiarazione che coinvolge HashMap
viene dopo BufferedReader
. Poi, aggiungo la seguente istruzione import al programma:
import java.util.HashMap;
Quando compilo di nuovo il programma, questa volta il compilatore mostra errore
eccezione non dichiarata IOException; deve essere catturato o dichiarato di essere gettati
Le mie domande:
- Perché questo errore non gettato nel precedente tentativo di compilazione?
- L'ordine in cui arriva l'errore di compilazione non sembra naturale. Quali sono i principi di progettazione del compilatore che entrano in gioco durante questa routine?
perché il compilatore non parla dell'eccezione non rilevata in questo passaggio? – Bhoot
@Bhoot L'unica ragione per cui ho potuto pensare è che non ha ancora raggiunto la fase di controllo delle eccezioni non rilevate. È tornato immediatamente quando ha incontrato i tipi senza importazioni. – manouti
Non sono d'accordo con questo motivo, ma sembra innaturale.Apprezzerò qualsiasi letteratura che affronta questo argomento (o qualsiasi cosa ad esso correlata). – Bhoot