2014-09-07 9 views
5

ricerca di questo codice:variabile potrebbe essere già stata assegnata quando non può essere assegnato

public class TestFinalAndCatch { 
    private final int i; 

    TestFinalAndCatch(String[] args) { 
     try { 
      i = method1(); 
     } catch (IOException ex) { 
      i = 0; // error: variable i might already have been assigned 
     } 
    } 

    static int method1() throws IOException { 
     return 1; 
    } 
} 

compilatore dice che java: variable i might already have been assigned

Ma per me è assomiglia situazione impossibile.

+0

Questo è davvero un buona risposta alla stessa domanda: http://stackoverflow.com/a/17075219/1354590 – kuporific

+0

E la soluzione è già presentata qui http://stackoverflow.com/a/13604193/1354590 – kuporific

risposta

7

i è definitivo, quindi può essere assegnato solo una volta. Il compilatore probabilmente non è abbastanza intelligente da comprendere che se viene lanciata un'eccezione, il primo compito non avrà luogo e se non viene lanciata un'eccezione, il secondo compito non avrà luogo.

+0

Sì , ma la mia situazione come se fosse – gstackoverflow

+0

no .. non è come se altro. può capitare che tu venga assegnato e quindi il tuo codice genera l'eccezione – Adi

+0

@Adi nella mia situazione è impossibile – gstackoverflow

4

Il problema è che in questo caso il compilatore funziona basato sulla sintassi e non su base semantica. Ci sono 2 soluzioni: prima base su movimento maniglia eccezione sul metodo:

package com.java.se.stackoverflow; 

public class TestFinalAndCatch { 
    private final int i; 

    TestFinalAndCatch(String[] args) { 
     i = method1(); 
    } 

    static int method1() { 
     try { 
      return 1; 
     } catch (Exception ex) { 
      return 0; 
     } 
    } 
} 

seconda base sull'utilizzo temporar variabile:

package com.java.se.stackoverflow; 

import java.io.IOException; 

public class TestFinalAndCatch { 
    private final int i; 

    TestFinalAndCatch(String[] args) { 
     int tempI; 
     try { 
      tempI = method1(); 
     } catch (IOException ex) { 
      tempI = 0; 
     } 
     i = tempI; 
    } 

    static int method1() throws IOException { 
     return 1; 
    } 
} 
0

Per superare questo problema, utilizzare una variabile locale nel tentativo di cattura bloccare e quindi assegnare quel risultato alla variabile di istanza.

public class TestFinalAndCatch { 
    private final int i; 

    TestFinalAndCatch(String[] args) { 
     int tmp; 
     try { 
      tmp = method1(); 
     } catch (IOException ex) { 
      tmp = 0; 
     } 
     i = tmp; 
    } 

    static int method1() throws IOException { 
     return 1; 
    } 
} 
+0

mmm .. grazie, ma non voglio superare questo problema)) domanda su come è possibile – gstackoverflow

0

https://bugs.openjdk.java.net/browse/JDK-6326693?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

Sembra JDK bug. E ora lo stato - Risolto. Ma non riesco a trovare da quale versione.

+1

No, questo era un bug quando una variabile finale era assegnata in più blocchi * catch *, non nel 'try' e "prendere". Inoltre, questo bug è stato risolto in Java 8. – kuporific

+0

https://community.oracle.com/thread/2135358?tstart=0 – gstackoverflow

Problemi correlati