# Probleme if-Anweisung



## IwiS (20. Feb 2012)

Hallo alle zusammen,

ich habe Probleme mit eine If-Anweisung in meinem Programm. Mein Programm schreibe ich in Eclipse, dort bekomme ich bei meine dem "else" meiner If-Anweisung folgende Fehlermeldung:

```
Syntax error on token "else", delete this token
```
Mein Quellcode sieht wie folgt aus:

```
try
	{
     Properties properties2 = new Properties();
     FileInputStream in = new FileInputStream("einstellungen.properties");
     properties2.load(in);
     if(string == (properties2.getProperty("Passwort")));
     dialog4.dispose();
 	 else
 	 final JDialog dialog5 = new JDialog();
 	 dialog5.setLocation(700, 375);
 	 dialog5.setSize(200, 150);
 	 dialog5.setTitle("Passwort falsch");
 	 dialog5.setVisible(true);
 	 label = new JLabel("Das eingegebene Passwort ist falsch");
 	 Panel panel4 = new JPanel();
 	 JButton button3 = new JButton("Erneut versuchen");
 	 button3.addActionListener(new ActionListener()
 	 {
 	  public void actionPerformed(ActionEvent ev)
 	  {
 	 dialog5.dispose();
 	  }
 	 }
 	 );
 	 panel4.add(button3);
 	 dialog5.add(panel4, BorderLayout.SOUTH);
 	 dialog5.add(label, BorderLayout.CENTER);
	}
	catch(Exception e)
	{
     e.printStackTrace();
	}
```

Ich verstehe nicht, warum Eclipse das "else" weghaben will, ich brauche es doch für meine If-Anweisung, was kann ich tun, um dieses Problem zu umgehen?

lg IwiS


----------



## Tomate_Salat (20. Feb 2012)

Aus diesem Grund solltest du die [c]{[/c]-Klammern verwenden. Dann würde dir dieser Fehler nicht passieren. Schau mal diese Zeile genau an:
[java=6]if(string == (properties2.getProperty("Passwort")));[/code]

außerdem vergleicht man komplexe Datentypen (wozu auch Strings gehören) mit [c].equals(...)[/c]


----------



## tfa (20. Feb 2012)

Was soll das Semikolon in Zeile 6?
Setze grundsätzlich die Codeabschnitte für den then- und else-Fall in geschweifte Klammern, also

```
if (bedingung) {
...
}
else {
..
}
```


----------



## IwiS (20. Feb 2012)

Hallo,

was das Semikolon da zu suchen hat, kann ich mir selbst nicht erklären. Die geschweiften Klammern hatte ich zuerst, nachdem ich mich dann aber im Internet umgesehen hatte, haben viele Leute keine Klammern verwendet, also dachte ich mir, es sei vllt. besser ohne Klammern zu arbeiten. Das eigentliche Problem lag bei der If-Bedingung.
Ich habe allerdings noch eine Frage. Bei meinem Programm öffnet sich ein Dialog, wie kann ich es möglich machen, dass man von dem Dialog auf keinen Fall in das dahinter liegende Fenster wechseln kann. Ich verwende schon 
	
	
	
	





```
dialog.setAlwaysOnTop(true)
```
, damit der Dialog beim Erscheinen gleich ganz oben ist. Jetzt brauche ich nur noch den Code, damit ich von dem Dialog nicht in das dahinterliegende Fenster wechseln kann.

lg IwiS


----------



## IwiS (20. Feb 2012)

Hallo,

habe eine Lösung gefunden, danke.

lg IwiS


----------



## Camino (20. Feb 2012)

Einen JDialog setzt man auf modal mit setModal(true), dann kannst du solange nichts in deinem dahinterliegenden Programm machen, bis der Dialog wieder geschlossen wird.

Und das mit den geschweiften Klammern bei if: Wenn du nur 1 Anweisung bei if oder else hast, bräuchtest du diese Klammern nicht unbedingt, ist aber trotzdem sinnvoller und vermeidet Fehler oder Verwirrung...


----------



## IwiS (20. Feb 2012)

Hi,

genau das habe ich gemacht.

lg IwiS


----------



## IwiS (20. Feb 2012)

Hallo,

folgendes Problem, bei meiner If-Anweisung wird einfach die erste Anweisung übergangen, egal, ob die Bedingung erfüllt ist oder nicht, und mit der else-Anweisung weitergemacht. Warum ist das so?

lg IwiS

Mein Code:

```
try
	{
     Properties properties2 = new Properties();
     FileInputStream in = new FileInputStream("einstellungen.properties");
     properties2.load(in);
     if(string.equals(properties2.getProperty("Passwort")))
     {
      dialog4.dispose();
     }
     else
     {
 	 final JDialog dialog5 = new JDialog(dialog4, "Passwort falsch", true);
 	 dialog5.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
 	 dialog5.setLocation(700, 262);
 	 dialog5.setSize(200, 150);
 	 JLabel label = new JLabel("  Das eingegebene Passwort ist falsch");
 	 JPanel panel4 = new JPanel();
 	 JButton button3 = new JButton("Erneut versuchen");
 	 button3.addActionListener(new ActionListener()
 	 {
 	  public void actionPerformed(ActionEvent ev)
 	  {
 	   dialog5.dispose();
 	  }
 	 }
 	 );
 	 panel4.add(button3);
 	 dialog5.add(panel4, BorderLayout.SOUTH);
 	 dialog5.add(label, BorderLayout.CENTER);
 	 dialog5.setVisible(true);
 	 }
	}
	catch(Exception e)
	{
     e.printStackTrace();
	}
```


----------



## tfa (20. Feb 2012)

Wenn der else-Block ausgeführt wird, ist die Bedinung eben nicht erfüllt.
Lass dir doch mal die Strings, die du vergleichst, ausgeben. Die müssten unterschiedlich sein.


----------



## IwiS (20. Feb 2012)

Hi,

ich habe mir die Strings ausgeben lassen, beide gleich. Wenn ich die if und else Blöcke vertausche, wird auch der else-Block ausgeführt.

lg IwiS


----------



## tfa (20. Feb 2012)

Was gibt

```
System.out.println(string.equals(properties2.getProperty("Passwort"));
```
aus?


----------



## IwiS (20. Feb 2012)

Hallo,

was soll das ausgeben, ausser Fehler?

lg IwiS


----------



## Tomate_Salat (20. Feb 2012)

Im idealfalle gibt das [c]true[/c] aus.
Wenn [c]false[/c], dann sind deine Strings nicht gleich
Wenn ein Fehler kommt, dann diesen hier posten ;-)


----------



## Camino (20. Feb 2012)

IwiS hat gesagt.:


> Hallo,
> 
> was soll das ausgeben, ausser Fehler?
> 
> lg IwiS



Oh je, weil das vielleicht genau die Bedingung ist, welche du bei if abfragst. Wenn das Fehler produziert, dann stimmt da wohl was nicht...


----------



## IwiS (20. Feb 2012)

Hi,

es kommt false herraus. Ich glaube aber trotzdem, dass i-was mit der If-Kontrollstruktur nicht stimmt, denn wenn ich die Anweisung aus dem "else"-Block in den "if"-Block schreibe, wird das gemacht, was in dem "if"-Block steht, egal, was ich eingebe.

lg IwiS


----------



## Tomate_Salat (20. Feb 2012)

Hast du schonmal geschaut, was bei:

```
System.out.println(strings);
System.out.println(properties2.getProperty("Passwort"));
```
rauskommt? Sind da vllt Whitespaces o.ä. dazwischen?


----------



## IwiS (20. Feb 2012)

Hallo,

ich habe mal ein anderes Passwort genommen. Jetzt kommt true heraus, jedoch funktioniert die Passwortabfrage (der Quellcode) nicht.

lg IwiS


----------



## tfa (20. Feb 2012)

IwiS hat gesagt.:


> jedoch funktioniert die Passwortabfrage (der Quellcode) nicht.


Dann ist wohl noch ein Fehler drin...


----------



## Camino (20. Feb 2012)

IwiS hat gesagt.:


> ich habe mal ein anderes Passwort genommen. Jetzt kommt true heraus



Es sollte wohl true herauskommen, wenn das eingegeben Passwort mit dem in den Properties stimmt. Wenn das so ist, dann ist doch prima...



> jedoch funktioniert die Passwortabfrage (der Quellcode) nicht.



Was meinst du mit Passwortabfrage? Vielleicht musst du den relevanten Code nochmal kurz hier posten, falls du was geändert hast.


----------



## IwiS (20. Feb 2012)

Hallo,

hier ist der relevante Code:


```
final JDialog dialog4 = new JDialog(prog, "Passwortabfrage", true);
  dialog4.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
  dialog4.setFocusableWindowState(true);
  dialog4.setLocation(575, 262);
  dialog4.setSize(450, 110);
  JPanel panel2 = new JPanel();
  JTextField textfield2 = new JTextField(50);
  panel2.add(textfield2);
  JPanel panel3 = new JPanel();
  final String string = textfield2.getText();
  JButton button2 = new JButton("Weiter");
  button2.addActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent ev)
   {
	try
	{
     Properties properties2 = new Properties();
     FileInputStream in = new FileInputStream("einstellungen.properties");
     properties2.load(in);
     if(string.equals(properties2.getProperty("Passwort")))
     {
      dialog4.dispose();
     }
     else
     {
 	 final JDialog dialog5 = new JDialog(dialog4, "Passwort falsch", true);
 	 dialog5.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
 	 dialog5.setLocation(700, 262);
 	 dialog5.setSize(200, 150);
 	 JLabel label = new JLabel("  Das eingegebene Passwort ist falsch");
 	 JPanel panel4 = new JPanel();
 	 JButton button3 = new JButton("Erneut versuchen");
 	 button3.addActionListener(new ActionListener()
 	 {
 	  public void actionPerformed(ActionEvent ev)
 	  {
 	   dialog5.dispose();
 	  }
 	 }
 	 );
 	 panel4.add(button3);
 	 dialog5.add(panel4, BorderLayout.SOUTH);
 	 dialog5.add(label, BorderLayout.CENTER);
 	 dialog5.setVisible(true);
 	 }
	}
	catch(Exception e)
	{
     e.printStackTrace();
	}
   }
  }
  );
  panel3.add(button2);
  JButton button3 = new JButton("Beenden");
  button3.addActionListener(new ActionListener()
  {
   public void actionPerformed(ActionEvent ev)
   {
	System.exit(0);
   }
  }
  );
  panel3.add(button3);
  dialog4.add(panel3, BorderLayout.SOUTH);
  dialog4.add(panel2, BorderLayout.CENTER);
  dialog4.setVisible(true);
```

lg IwiS


----------



## Camino (20. Feb 2012)

Moment mal, wenn du ein Textfeld neu erstellst und dann dort sofort den String rausholst, ist der doch erst mal leer:
[JAVA=7]
JTextField textfield2 = new JTextField(50);
panel2.add(textfield2);
JPanel panel3 = new JPanel();
final String string = textfield2.getText();
[/code]

Also, steht im String nix drin. Du musst das 
	
	
	
	





```
final String string = textfield2.getText();
```
 im ActionListener machen.


----------



## truesoul (20. Feb 2012)

Naja deine Variable "string", übrigens echt grauenhaft der Code und die Bezeichnung der Variablen, ist leer.
Mache mal 

```
string = textfield2.getText();
```

vor dein 

```
Properties properties2 = new Properties();
```
!

Den rest hab ich mir jetzt nicht angeschaut


----------



## IwiS (20. Feb 2012)

Hi,

danke für die Tipp's, es hat funktioniert. 
@truesoul:
Könntest du mir vllt. erklären, was du an dem Code verbessern würdest.

lg IwiS


----------



## truesoul (20. Feb 2012)

Ja könnte ich  Oder du liest dir erstmal das hier durch. 

Mfg


----------



## IwiS (20. Feb 2012)

Hallo,

wenn *du* meinst, dass mein Code schlecht ist, dann sag *du* mir auch, warum und was man verbessern kann!

lg IwiS


----------



## Tomate_Salat (20. Feb 2012)

dialog1
properties2

das sind keine Namen für variablen. Man verwendet hier treffendere Bezeichnungen anstatt das Schema:
[Datentype][counter]
zu verwenden. Gewöhn dir lieber gleich eine sinnvolle Namensgebung an.

z.B. loginDialog anstatt dialog299938382939


----------



## truesoul (20. Feb 2012)

Keine sprechende Variablenamen
Kein camelCase 
Von Zeile 27 - 45 zum Beispiel sollte ausgelagert werden
Auslagern von Code in Methoden 
Anstatt System.exit(0); sollte dispose() verwendet werden
Variablen verwenden und nicht sowas wie in der If Bedingung machen

Zu 5. Wobei EXIT_ON_CLOSE auch System.exit() verwendet!

Das hättest du, zum teil, sicherlich auch dort nachlesen können.


----------

