2015-06-29 15 views
11

Ho una domanda molto stupida per voi :)try-catch e le variabili finali

Per esempio, ho seguito frammento di codice:

class MyClass { 

    public static void main (String[] args) { 

     final String status; 

     try { 
      method1(); 
      method2(); 
      method3(); 
      status = "OK"; 
     } catch (Exception e) { 
      status = "BAD"; // <-- why compiler complains about this line?? 
     } 

    } 

    public static void method1() throws Exception { 
     // ... 
    } 

    public static void method2() throws Exception { 
     // ... 
    } 

    public static void method3() throws Exception { 
     // ... 
    } 

} 

La domanda è all'interno: perché il compilatore si lamenta di questa linea ?

IntelliJ IDEA dice, che Variable 'status' might already have been assigned to.

Ma, come posso vedere, non raggiungiamo mai la linea (dove impostiamo status = "OK") in caso di situazione eccezionale. Quindi la variabile status sarà BAD e tutto dovrebbe essere ok. E se non abbiamo alcuna eccezione, allora otteniamo OK. E imposterai questa variabile solo una volta.

Qualche idea a riguardo?

Grazie per il vostro aiuto!

+1

compilatore non è così intelligente, e se si dichiara che il metodo potrebbe gettare un compilatore un'eccezione solito essere fatica a controllare, così per semplicità non permette queste cose accada – Toumash

risposta

10

Il compilatore Java non vede quello che tu e io vediamo - che sia status sia impostato su "OK" o che sia impostato su "BAD". Si presuppone che status può essere impostato e viene generata un'eccezione, nel qual caso viene assegnato due volte e il compilatore genera un errore.

Per risolvere il problema, assegnare una variabile temporanea per il blocco try - catch e assegnare la variabile final una volta in seguito.

final String status; 
String temp; 

try { 
    method1(); 
    method2(); 
    method3(); 
    temp = "OK"; 
} catch (Exception e) { 
    temp = "BAD"; 
} 

status = temp; 
+0

Penso che sia ancora un errore valido, cosa succede se questo thread viene interrotto e genera 'InterruptedException' subito dopo l'assegnazione –

+1

@JigarJoshi Non può lanciare 'InterruptedException' (forse qualcosa altrimenti, ma non quello, e probabilmente non in questo codice). –

+0

se questo era in thread separato e che è stato chiamato su 'interrupt()' –

2

Cosa succede se il codice che ha causato l'eccezione si è verificato dopostatus = "OK"? Il motivo per cui ottieni l'errore sembra abbastanza ovvio.

Prendete questo ad esempio:

final String status; 

try { 
    status = "OK": 
    causeException(); 
}catch(Exception e) { 
    status = "BAD"; 
} 

void causeException() throws Exception() { 
    throw new Exception(); 
} 

Questo comporterebbe riassegnazione variabile, che è il motivo per cui si ottiene un errore.

+2

La variabile è definitiva . La riassegnazione è vietata. – swinkler

+4

@swinkler Questo è il punto che sto attraversando. L'errore si verifica perché il codice mostrato sopra è possibile. Amico, che succede con StackOverflow ora-a-giorni .. –

Problemi correlati