2011-09-29 11 views
5

Ho un problema n00b/di base relativo al try catch su java.Problema dell'ambito su un comando catch try

Ini myIni; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

myIni.get("toto"); 

e il messaggio di errore che segue: variabile myIni potrebbe non essere stato inizializzato

è la portata del try limitato solo all'area tentativo? Come posso recuperare il risultato di myIni nel seguente codice?

+0

Non eseguire 'e.printStackTrace()'. Basta buttare e'. – BalusC

risposta

6

Per evitare il messaggio, è necessario impostare un valore predefinito prima dell'istruzione try.
Oppure è necessario mettere la chiamata al metodo get() nell'istruzione try.

+0

hoho, quella era davvero una domanda n00b quindi :) grazie. – Cornelius

+1

@Cornelius - anche le domande n00b sono utili;) –

+0

Non ci sono domande noob. – Simeon

0

Basta inserire myIni.get ("toto") all'interno del blocco catch try o scrivere Ini myIni = null; nella prima fila. Nota che se fai la seconda variante potresti ottenere una NullPointerException se il file non viene trovato, o non può essere letto per nessun altro motivo ...

evviva! P

0

scrittura Ini myIni = null; e basta

1

è la portata del try limitato solo all'area tentativo? La risposta è si. Il problema che hai è che hai dimenticato di inizializzare il tuo oggetto.

Prova questo:

Ini myIni=null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

per evitare il vostro programma dal recieving NullPointerException, l'esecuzione di un controllo per assicurarsi che la chiamata all'interno del blocco try portato alla Oggetto stata costruita con alcuni dati.

if(myIni !=null) 
{ 
    myIni.get("toto"); 
} 

alternativa se non si desidera chiamare myIni al di fuori del blocco try/catch, perché se si verifica un'eccezione, l'oggetto sarà a tutti gli effetti essere null, allora si può fare come segue.

try { 
    Ini myIni= new Ini(new FileReader(myFile)); 
    myIni.get("toto"); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
0

Nell'istruzione catch, non si definisce il valore della variabile. Pertanto, la variabile non avrà un valore se si cattura allora eseguito myIni.get("toto");. Che ci si vuole fare qualcosa di simile:

Ini myIni = null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

myIni.get("toto"); 

Anche così, si otterrà un NPE durante l'esecuzione get().

2

Nella vostra il modo corretto di fare quello che vuoi è quello di mettere myIni.get("toto"); all'interno del blocco try:

try { 
    Ini myIni = new Ini(new FileReader(myFile)); 
    myIni.get("toto"); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Non fare Ini myIni = null; come alcune risposte suggerite. In questo caso, il tuo codice genererà NullPointerException, se viene lanciato un IOException all'inizializzazione di myIni.

+0

non se si verifica la presenza di null prima della riga 'myIni.get (" toto ");' – Simeon

4

Sì, lo scopo della prova è limitato a quello.In effetti la portata inizia con {e finisce con}, quindi questo sarebbe anche creare un sub-ambito

void foo() { 
    { 
    Ini myIni = new Ini(new FileReader(myFile)); 
    } 

    myIni.get("toto"); //error here, since myIni is out of scope 
} 

Per risolvere il problema, inizializzare myIni con null, ed essere consapevoli che se il tentativo fallisce, myIni.get("toto"); si tradurrebbe in una NullPointerException.

Quindi è necessario fornire un account o lanciare un'altra eccezione dal blocco catch.

Verificare la presenza di null:

Ini myIni = null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

if(myIni != null) { 
    myIni.get("toto"); 
    //access the rest of myIni 
} else { 
    //handle initialization error 
} 

eccezione del tiro:

Ini myIni = null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
    throw new MyCustomInitFailedException(); //throw any exception that might be appropriate, possibly wrapping e 
} 

myIni.get("toto"); 

come già suggerito da @khachik si potrebbe anche mettere il blocco try intorno l'intero utilizzo di myIni se questo è possibile e opportuno. Quale soluzione scegli dipende dalle altre tue esigenze e dal tuo design.

1

Questo è il modo in cui il compilatore può affermare che l'inizializzazione di myIni potrebbe non riuscire. Perché la linea myIni = new Ini(new FileReader(myFile)); potrebbe generare un'eccezione.

Se non riesce quando si arriva alla linea myIni.get("toto");myIni non sarebbe stato inizializzato.

si hanno 2 scelte:

  1. Ponga il myIni.get("toto"); all'interno del blocco try.
  2. Assegnare un valore null iniziale a myIni quando lo si definisce e controllare null al di fuori del blocco try.
0

nel codice, se si verifica un'eccezione, la variabile myIni non può essere istanziata, ecco perché il compilatore aumenta tale avviso.

si può cambiare a:

Ini myIni = null; 
try { 
    myIni = new Ini(new FileReader(myFile)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
if(myIni!=null){ 
myIni.get("toto"); 
} 
0

Come @khachik ha sottolineato, è meglio dichiarare e inizializzare la variabile all'interno del blocco try stesso. Inizializza come di seguito, al di fuori della prova bock solo se ti senti estremamente fiducioso che è indistinguibile dall'arroganza.

Ini myIni = null;