Fehlermeldung bei switch unklar

  • Themenstarter Themenstarter späterGast
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
S

späterGast

Gast
Hallo,
habe folgende Fehlermeldung zu diesem Prog (Ausschnitt) bekommen:
Code:
switch (x)
  {
    case 1:
      p=0.3f;break;
    case 2:
      p=0.5f;break;
    case 3:
      p=0.7f;break;
    case 4:
      p=1.2f;break;
    default: p=0;
  }
pb=m*p;

die fehlermeldung lautet:
test.java:35: variable p might not have been initialized
pb=m*p;
^
1 error
Im default ist doch die Festlegung für p getroffen, falls x einen anderen Wert als in case vorgesehen annimmt. Habe dann vor switch p auf 0 initialisiert und es klappt. Aber warum nicht so wie ich es erwartet habe?
Danke!
 
späterGast hat gesagt.:
Im default ist doch die Festlegung für p getroffen, falls x einen anderen Wert als in case vorgesehen annimmt. Habe dann vor switch p auf 0 initialisiert und es klappt. Aber warum nicht so wie ich es erwartet habe?
Danke!

Weil, wie schon die Fehlermeldung sagt, du die Variable vorher initialisieren musst. :wink:
 
Da versteh ich wohl was falsch:
Initialisierung ist doch Wertzuweisung. Falls x einen ungeplanten Wert hat, soll p auf 0 gesetzt werden. Ist das nicht auch eine Initialisierung von p?
Danke für die schnelle Antwort
 
Ja, ist es. Aber du musst p initialisieren, bevor du es benutzt. Hast doch selber geschrieben, dass es funktioniert, wenn du p vorher einen Wert (zB. 0) zuweist. :?
 
das ist in der tat komisch, hätte gedacht der compiler wär schlau genug den default case zu erkennen
 
Jango hat gesagt.:
Ja, ist es. Aber du musst p initialisieren, bevor du es benutzt. Hast doch selber geschrieben, dass es funktioniert, wenn du p vorher einen Wert (zB. 0) zuweist. :?

du musst p initialisieren bevor du auf p lesend zugreifen willst. Das hast du hier allerdings getan in dem default case. Also insofern sollte da keine warnung kommen :shock:
 
Anonymous hat gesagt.:
du musst p initialisieren bevor du auf p lesend zugreifen willst. Das hast du hier allerdings getan in dem default case. Also insofern sollte da keine warnung kommen :shock:

Genau - und deshalb gehts ja auch nicht. Verblüffende Logik :toll:
 
Anonymous hat gesagt.:
Anonymous hat gesagt.:
du musst p initialisieren bevor du auf p lesend zugreifen willst. Das hast du hier allerdings getan in dem default case. Also insofern sollte da keine warnung kommen :shock:

Genau - und deshalb gehts ja auch nicht. Verblüffende Logik :toll:

hää?

Weiss jetzt hier jemand warum da der Fehler kommt?
 
Code:
pb=m*p;

Hier steckt der Fehler. Du benutzt eine nicht initialisierte Variable rechts von einer Zuweisung. Was soll denn pb zugewiesen werden, wenn der Compiler nicht weiß, wie groß p ist? Das wird doch erst zur Laufzeit bestimmt.

Edit: Initialisiere die Variable einfach vorher - dann gibts vom Compiler keine Meckerei. Compiler nörgeln bei sowas immer... 😀
 
Nun ja, p wurde bereits vor switch deklariert, und damit doch wohl auch ein Speicherbereich entsprechend reserviert. Und ich nahm eben an, daß über switch default die Initialisierung erfolgen müßte, wozu sonst default?
MfG
 
Eine Deklaration reserviert Speicher, ja und? Das hat doch absolut nichts mit der Initialisierung zu tun. :roll:
Und default ist dazu da, der Variablen einen Wert zuzuweisen, wenn keine Marke zutrifft. Das ist optional und kann theoretisch und auch praktisch weggelassen werden. Ich habe dir doch schon geschrieben, dass du unter der switch-Anweisung eine Variable für eine Zuweisung benutzt, deren Wert zur Kompilierzeit noch gar nicht feststeht. Woher soll denn der Compiler wissen, welche switch-Marke zur Laufzeit zutrifft - also ist p für ihn nicht initialisiert. Nach deiner Theorie hätte ja die Variable p zur Kompilierzeit, einschließlich default, fünf Werte. Überleg doch mal... :wink:

Sollte ich mich täuschen, belehre man mich eines Besseren. Wenn ich beim kompilieren solche Fehler erhalte, dann kriegt die Variable halt einen Startwert und fertig. Was ist daran so schwierig? Im Übrigen macht man das auch so.
Tschau
J.
 
Jango hat gesagt.:
Woher soll denn der Compiler wissen, welche switch-Marke zur Laufzeit zutrifft - also ist p für ihn nicht initialisiert. Nach deiner Theorie hätte ja die Variable p zur Kompilierzeit, einschließlich default, fünf Werte. Überleg doch mal... :wink:
Na, der Compiler sollte erkennen, dass p initialisiert wird, egal welche Marke angelaufen wird :wink:
Der Eclipse-Compiler scheint das übrigens zu erkennen ???:L
 
Jango hat gesagt.:
Eine Deklaration reserviert Speicher, ja und? Das hat doch absolut nichts mit der Initialisierung zu tun. :roll:
Und default ist dazu da, der Variablen einen Wert zuzuweisen, wenn keine Marke zutrifft. Das ist optional und kann theoretisch und auch praktisch weggelassen werden. Ich habe dir doch schon geschrieben, dass du unter der switch-Anweisung eine Variable für eine Zuweisung benutzt, deren Wert zur Kompilierzeit noch gar nicht feststeht. Woher soll denn der Compiler wissen, welche switch-Marke zur Laufzeit zutrifft - also ist p für ihn nicht initialisiert. Nach deiner Theorie hätte ja die Variable p zur Kompilierzeit, einschließlich default, fünf Werte. Überleg doch mal... :wink:

Sollte ich mich täuschen, belehre man mich eines Besseren. Wenn ich beim kompilieren solche Fehler erhalte, dann kriegt die Variable halt einen Startwert und fertig. Was ist daran so schwierig? Im Übrigen macht man das auch so.
Tschau
J.

sry aber das ist unsinn. Der Compiler weiss ja sogut wie nie zur compilezeit welchen wert erzuweisen soll. Es muss nur wissen ob da ein wert zugewiesen wird oder nicht. Und der default case garantiert das p auf jeden fall ein wert zugewiesen wird. Ist ist nicht möglich das p uninitialisiert ist zum zeitpunkt von
und das sollte der compiler entsprechend erkennen.
 
@ Gast - wenn das alles so ein Unsinn ist, dann erkläre mir bitte, woher der Fehler kommt? Wenn das alles richtig ist, und es ja eigentlich auch ohne Fehlermeldung abgehen müsste? :?:
Hab damit kein Problem, nicht recht zu haben. Aber auf eine Erklärung deinerseits, warum der Fehler kommt, warte ich noch...

Gast hat gesagt.:
"du musst p initialisieren bevor du auf p lesend zugreifen willst. Das hast du hier allerdings getan in dem default case. Also insofern sollte da keine warnung kommen"

Das hilft dem Frager genauso wenig, wie eine falsche Antwort! (sollte, könnte, hätte...)
 
warum da eine warnung kommt weiss ich nicht wie ich ja auch schon geschrieben hab, und ich meine ja auch das die unnötig ist und der compiler es also einfach nicht überprüft.

Eine falsche Antwort prägen sich leute ein und denken sie wäre richtig. Deswegen sollte man so etwas nicht einfach so stehen lassen.

btw. ich wollte dich nicht angreifen oder hier ein flamewar starten, also peace 😉
 
Jango hat gesagt.:
@ Gast - wenn das alles so ein Unsinn ist, dann erkläre mir bitte, woher der Fehler kommt? Wenn das alles richtig ist, und es ja eigentlich auch ohne Fehlermeldung abgehen müsste? :?:
Auf die Antwort, warum die Fehlermeldung kommt, wartet der Fragesteller noch. Denn es gibt keinen Grund für diese Fehlermeldung. Es ist sicher, dass p initialisiert wird. Der Compiler hat keinen Grund hier etwas anzumeckern.
Die Aussage "Dann initialisier es halt...." ist da nicht wirklich hilfreich.

Da ich mir das auch nicht erklären konnte, folgender Testcode:

Code:
public class Test{   
    
    public static void main(String[] args){
        
        int x= Integer.parseInt(args[0]);
        float p;
        switch (x) {
            case 1:
                p=0.3f;break;
            case 2:
                p=0.5f;break;
            case 3:
                p=0.7f;break;
            case 4:
                p=1.2f;break;
            default: p=0;
        }
        
        System.out.println(p);
    }
}

Und, wie erwartet: Er kompiliert. Nun ist die Frage, warum kompiliert der Code des Fragestellers nicht? Vlt. etwas mehr Code posten, dass man das ganze erkennen kann.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben