2016-09-28 27 views
1

Gibt es eine Funktion, mit der ich überprüfen kann, auf welchem ​​Pfad die Variable, für die ich den Fehler "möglicherweise nicht initialisiert" erhalten habe, nicht initialisiert wurde? Vorzugsweise entweder nativ für Java oder integriert in Intellij?Java - Wie wird mit dem Fehler "möglicherweise nicht initialisiert" verfahren?

EDIT: verwaltet meinen Code auf einen minimalen Fehler Beispiel zu reduzieren

class MyFailure{ 
    public static void main (String[] args) throws java.lang.Exception{ 
     String test; 
     boolean abort = false; 
     while(!abort){ 
      if(false){ 
       abort = true; 
       continue; 
      } 

      test = "stupid"; 
      if(test.equals("stupid")) break; 
     } 

     if(!abort){ 
      System.out.println(test); 
     } 
    } 
} 

Main.java:21: error: variable test might not have been initialized

die while-Schleife von einem Server-Socket liest Angenommen, bis der gepufferte Wert eine bestimmte Bedingung erfüllt, und die if(false) ist in der Tat eine Überprüfung, ob der Client die Verbindung geschlossen hat, wie würden Sie vorschlagen, dass ich damit umgehen?

+1

Wenn Sie den Pfad nicht mit Ihren Augen finden können, ist Ihr Code zu kompliziert. Zeig es. – Kayaman

+1

Nach meiner Erfahrung ist der Mechanismus für die Entscheidung nicht zu schlau (und sollte wahrscheinlich nicht zu kompliziert sein). Wenn ich zum Beispiel zwei if-else-Konstrukte hintereinander in einer Methode habe und ich weiß, dass ein bestimmter Pfad in der ersten einen bestimmten Pfad in der zweiten impliziert, wird Java das nicht herausfinden. Wenn also meine Variable nur in einem Pfad durch den ersten initialisiert wurde, lässt Java den Wert in keinem der Pfade im zweiten Pfad zu. –

+0

Ein möglicher Trick besteht darin, der Variablen in der Deklaration einen Nonsense-Wert zuzuweisen (wie -4736 für einen Int). Die zwei guten Effekte sind: Java ist glücklich. Und ich bin sicher, herauszufinden, ob der Unsinn-Wert wegen eines Programmierfehlers benutzt wird. –

Antwort

1

Für den Code in Ihrer Frage gibt es eine recht einfache Lösung: die Variable innerhalb der Schleife verwenden, wo Java sehen kann hat einen Wert:

public static void main (String[] args) throws java.lang.Exception{ 
    boolean abort = false; 
    while (!abort){ 
     if (false) { 
      abort = true; 
      continue; 
     } 

     String test = "stupid"; 
     if (test.equals("stupid")) { 
      System.out.println(test); 
      break; 
     } 
    } 
} 

Ob dies in Ihrem realen Code funktioniert Ich kann es nicht sagen. Ziehen Sie in Betracht, eine Methode zum Umgang mit dem vom Socket erhaltenen Wert zu extrahieren und sie im Beispiel von System.out.println() aus aufzurufen.

Edit: Für was es wert ist, kompiliert die folgende Version auch. Sie mögen denken, nach wie vor, dass die Verwendung des Wertes (der println) so tief verschachtelt reduziert Lesbarkeit:

public static void main (String[] args) { 
    if (! isFalse()) { 
     String test; 
     do { 
      test = "stupid"; 
     } while (! isFalse() && ! test.equals("stupid")); 
     if (! isFalse()) { // connection still open, so not aborted 
      System.out.println(test); 
     } 
    } 
} 

private static boolean isFalse() { 
    return false; 
} 

Wie in den Kommentaren erwähnt habe ich manchmal - zögernd - greifen die Variable in Frage mit einem unsinnig zu initialisieren/Scheinwert in der Deklaration, so dass, wenn dieser Wert jemals wegen eines Programmierfehlers verwendet wird, ich entdecken werde. In Ihrem Beispiel könnte ich null verwenden:

String test = null; 

Und nach der Schleife:

assert test != null; 

so werde ich fangen, wenn es nicht einen richtigen Wert erhalten hat. Es ist keine Lösung, mit der ich glücklich bin, aber es passiert, dass ich nichts besseres finde.

+0

Vielleicht ist nicht die am besten lesbare Lösung, wenn man bedenkt, dass das '' println'' in meinem Beispiel ein Dummy für viel komplizierteren Code ist und - zum Beispiel und abhängig vom empfangenen Wert - mehr Daten vom Socket anfordern muss. (Auch das Problem trat innerhalb eines so großen Bereichs auf, während Sie vorschlugen, also würde ich innerhalb einer riesigen Zeitspanne eine riesige Weile haben, nur um Java zu sagen, dass die Variable tatsächlich initialisiert wurde.) – User1291

+0

Ich bin immer noch Wenn du denkst, dass du den viel komplizierteren Code in eine separate Methode legst, kannst du damit etwas überschaubares erreichen. Ich habe deinen Code jedoch noch nicht gesehen, also nimm mein Wort nicht dafür. –

+0

Sie wissen ... Ich habe gerade bemerkt, dass wenn ich '' String test = null'' und dann auf '' null'' setze, intellij mich warnen, dass> 'test! = Null'' immer wahr ist. Aber wenn ich das '' = null'' entferne, bekomme ich den "vielleicht nicht initialisiert" -Fehler ... also arbeite ich mit einem Programm, das KANN sagen kann, dass ich dem String zuordne und gleichzeitig kann es ' t .... seltsam. – User1291

Verwandte Themen