2014-09-07 3 views
5

Forschung diesen Code zugewiesen werden:Variable könnte bereits zugewiesen wurden, wenn es nicht

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; 
    } 
} 

Compiler sagt, dass java: variable i might already have been assigned

Aber für mich ist es sieht aus wie unmögliche Situation.

+0

Dies ist eine wirklich gute Antwort auf die gleiche Frage: http://stackoverflow.com/a/17075219/1354590 – kuporific

+0

Und die Problemumgehung ist bereits hier vorgestellt http://StackOverflow.com/A/13604193/1354590 – kuporific

Antwort

7

i ist endgültig, daher kann es nur einmal vergeben werden. Der Compiler ist wahrscheinlich nicht intelligent genug, um zu erkennen, dass, wenn eine Ausnahme ausgelöst wird, die erste Zuweisung nicht stattfindet, und wenn keine Ausnahme ausgelöst wird, findet die zweite Zuweisung nicht statt.

+0

Ja , aber meine Situation wie wenn sonst – gstackoverflow

+0

nein .. es ist nicht wie wenn sonst. es kann passieren, dass Ihr ich zugewiesen und dann Ihr Code wirft Ausnahme – Adi

+0

@Adi in meiner Situation ist es unmöglich – gstackoverflow

4

Das Problem ist, dass in diesem Fall Compiler Syntax-basiert nicht semantisch-basiert arbeitet. Es gibt zwei Lösungen: erste Basis Ausnahme Griff Methode auf bewegte:

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; 
     } 
    } 
} 

Zweite Basis zur Verwendung von Temporär-Variable:

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

Um dieses Problem zu überwinden, eine lokale Variable in dem try-catch verwenden Blockieren und dann dieses Ergebnis der Instanzvariablen zuweisen.

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 .. danke, aber ich möchte dieses Problem nicht überwinden)) Frage, wie es möglich ist – gstackoverflow

0

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

Sieht aus wie JDK Fehler. Und jetzt Status - Fest. Aber von welcher Version kann ich nicht herausfinden.

+1

Nein, das war ein Fehler, wenn eine letzte Variable in mehreren * catch * Blöcken zugewiesen wurde, nicht im 'try' und 'fangen'. Dieser Fehler wurde auch in Java 8 behoben. – kuporific

+0

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

Verwandte Themen