-
13. 12. 2011, 16:51 #14 Jahre hier
- Registriert seit
- Mar 2006
- Beiträge
- 6.289
[Java] Kompletter Block wird übergangen?!
Moin,
wir sollen gerade eine GUI für eine Art Verwaltung schreiben, soweit auch kein Problem. Die Operationen sind einfügen, löschen und aktualisieren. Nach allen dreien soll ein kurzer Bestätigungsdialog eingeblendet werden. Beim Löschen funktioniert das auch, beim Rest jedoch nicht: Der Dialog wird zwar anscheinend angezeigt (zumindest wird in der Funktion ein kleiner Konsolenauswurf getätigt), jedoch wird er sofort wieder zerstört - das komische ist, dass genau das auch passieren soll, aber erst NACHDEM "OK" geklickt wurde. Meine Vermutung ist, dass das erste "ich bin mitm eingeben fertig"-OK nicht "entwertet" wird, sondern direkt als "ja, soll wirklich so"-OK weiterverarbeitet wird. Eigtl wollte ich das mit e.consume() erledigen, leider bietet ein ActionEvent sowas aber nicht an.
Die entsprechende Methode:
Da ich a) das erste Mal sowas mache und b) schon ordentlich rumexperimentiert hab, sieht der Code nicht mehr allzu schön aus. Die Klassen bzw Variablen sollten selbsterklärend sein.Code:@Override public void actionPerformed(ActionEvent e){ if(e.getActionCommand()=="löschen"){ try{ confirmFrame(selected, "löschen"); } catch(NullPointerException n){ } } if(e.getActionCommand()=="einfügen"){inputFrame(false);} if(e.getActionCommand()=="aktualisieren"){ try{ inputFrame(true); } catch(NullPointerException n){ initFrame(); } } if(e.getActionCommand()=="Help"){} if(e.getActionCommand()=="Cancel"){initFrame();} if(e.getActionCommand()=="OK"){ if(init.getTitle().equals("Bitte Daten eingeben!")){ if(changed){ input.setName(f_name.getText()); input.setRel(Float.parseFloat(f_rel.getText())); input.setVname(f_vname.getText()); confirmFrame(input, "aktualisieren"); } else{ input.setName(f_name.getText()); input.setRel(Float.parseFloat(f_rel.getText())); input.setVname(f_vname.getText()); confirmFrame(input, "einfügen"); } } if(conf.getTitle().equals("Bitte löschen bestätigen")){ s.removeMember(selected); initFrame(); } if(conf.getTitle().equals("Bitte einfügen bestätigen")){ s.addMember(input); conf.dispose(); initFrame(); } if(conf.getTitle().equals("Bitte aktualisieren bestätigen")){ selected.setName(input.getName()); selected.setVname(input.getVname()); selected.setRel(input.getRel()); initFrame(); } }
-
19. 12. 2011, 14:17 #2
Re: [Java] Kompletter Block wird übergangen?!
Strings werden nicht mit == verglichen.
Aus einem Forum für JavaProgrammierung:
das sollte es seinStrings werden nicht mit dem "==" Operator verglichen. Strings sind Objekte, die mit der Methode "equals(Object obj)" verglichen werden.
Wenn man sie mit "==" vergleicht, wird nicht der Inhalt der Objekte, sondern das Objekt selbst verglichen. Da das ja ein anderes ist, kann man sie so nicht vergleichen.
Bsp:
Java Code: Quelltext in neuem Fenster öffnen
Ausgabe:Code:String a = new String("blabla"); String b = new String("blabla"); if (a.equals(b)) { System.out.println("equals"); } if (a == b) { System.out.println("=="); }
equals
-
19. 12. 2011, 18:30 #3Mitglied
- Registriert seit
- Oct 2004
- Beiträge
- 560
Re: [Java] Kompletter Block wird übergangen?!
Jop weil Java kein Operator overloading kennt muss man strings mit equals vergleichen.
-
19. 12. 2011, 19:14 #4
Re: [Java] Kompletter Block wird übergangen?!
Wobei ja + für Strings doch "überladen" ist.
-
20. 12. 2011, 15:48 #5
Re: [Java] Kompletter Block wird übergangen?!
Alles richtig, nur kann es gerade bei Strings verwirrend sein, weshalb dieser Code
Die Ausgabe:Code:String a = "blabla"; String b = "blabla"; if (a.equals(b)) { System.out.println("equals"); } if (a == b) { System.out.println("=="); }
equals
==
erzeugt. Um das zu erklären muss man wissen, dass die JVM bei Strings mit einem Stringpool arbeitet und dort bei der Stringzuweisung nachschaut, ob der neue String schon vorhanden ist. Falls ja, wird kein neues Stringobjekt erzeugt, sondern nur noch die Referenz kopiert. Deshalb liefert ein Vergleich mit == true. Wird der neue String mit new erzeugt, ist dies nicht der Fall.
-
21. 12. 2011, 01:04 #6
Re: [Java] Kompletter Block wird übergangen?!
Als Ergänzung:
Es werden alle Strings im Pool gespeichert die beim kompilieren als Konstanten vorliegen. Also jeder String der in "" im Code steht. (es sei denn man benutzt new String(""))
http://en.wikipedia.org/wiki/String_interningThe single copy of each string is called its 'intern' and is typically looked up by a method of the string class, for example String.intern() in Java. All compile-time constant strings in Java are automatically interned using this method.
-
21. 12. 2011, 17:16 #74 Jahre hier
(Threadstarter)
- Registriert seit
- Mar 2006
- Beiträge
- 6.289
Re: [Java] Kompletter Block wird übergangen?!
Das dürfte aber eigtl nicht das Problem sein ( wobei ich zugeben muss, dass es nach diesen Infos wirklich unsauber aussieht), unser Übungsleiter hat uns einige Beispiele gegeben und da wurde das genauso gemacht => ich gehe davon aus, dass das so muss.
Aber um mal aufs Problem zu lenken: Die Überprüfung der Strings klappt soweit ich das beurteilen kann, es wird bloß eben der o.g. Block einfach voreilig übergangen.
-


Zitieren

mehr lesen...







Resident Evil 6 erscheint in...
Heute, 15:21 in gulli:news