PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] Problem mit JOptionPane.showInputDialog


Sergej
2009-12-17, 13:05:00
Hi,

ich lerne gerade Java und habe ein Problem mit JOptionPane.showInputDialog. Eingegeben werden sollen vier ganze Zahlen (z.B. 1, 2, 3, 4), allerdings über ein Dialogfenster.

Wenn ich statt

String s = JOptionPane.showInputDialog(null, "Bitte 4-Tupel eingeben");


einfach


String s;


nehme und folglich in der Console "java Schleife 1 2 3 4" eintippe, übernimmt er die Werte für int a,b,c,d. Mit JOptionPane.showInputDialog erhalte ich aber immer eine "ArrayIndexOutOfBoundsException"-Fehlermeldung.

Hier der relevante Teil vom Code:

import javax.swing.JOptionPane;

public class Schleife {

public static void main(String[] args) {

try {

String s = JOptionPane.showInputDialog(null, "Bitte 4-Tupel eingeben");
int a, b, c, d;

s = args[0];
a = Integer.parseInt(s);

s = args[1];
b = Integer.parseInt(s);

s = args[2];
c = Integer.parseInt(s);

s = args[3];
d = Integer.parseInt(s);


Kann mir hier jemand weiterhelfen?

Pinoccio
2009-12-17, 13:20:00
nehme und folglich in der Console "java Schleife 1 2 3 4" eintippe, übernimmt er die Werte für int a,b,c,d. Mit JOptionPane.showInputDialog erhalte ich aber immer eine "ArrayIndexOutOfBoundsException"-Fehlermeldung.Ja, weil args ja auch leer ist.


String s = JOptionPane.showInputDialog(null, "Bitte 4-Tupel eingeben");
int a, b, c, d;

String[] tupel=s.split(" ");

s = tupel[0];
a = Integer.parseInt(s);
//usw.
Funtkioniert, wenn dein Tupel durch ein einzelnes Leerzeichen (also den Charakter/die Regex bei s.split(String regex) (http://java.sun.com/javase/6/docs/api/java/lang/String.html#split%28java.lang.String%29)) getrennt ist. Und natürlich nur, wenn da dann auch brauchbare Zahlen (http://java.sun.com/javase/6/docs/api/java/lang/Integer.html#parseInt%28java.lang.String%29) drinne stehen.

"1 2 3 4".split(" ") ergibt {"1", "2", "3", "4"}.

hth, mfg

Gast
2009-12-17, 13:21:17
Wenn du keine Argumente beim Programmaufruf übergibst, dann ist args auch leer.
Außerdem muss es lauten

String s = JOptionPane.showInputDialog("Bitte 4-Tupel eingeben");

http://java.sun.com/javase/6/docs/api/javax/swing/JOptionPane.html

Sergej
2009-12-17, 13:39:46
Ja, weil args ja auch leer ist.


String s = JOptionPane.showInputDialog(null, "Bitte 4-Tupel eingeben");
int a, b, c, d;

String[] tupel=s.split(" ");

s = tupel[0];
a = Integer.parseInt(s);
//usw.
Funtkioniert, wenn dein Tupel durch ein einzelnes Leerzeichen (also den Charakter/die Regex bei s.split(String regex) (http://java.sun.com/javase/6/docs/api/java/lang/String.html#split%28java.lang.String%29)) getrennt ist. Und natürlich nur, wenn da dann auch brauchbare Zahlen (http://java.sun.com/javase/6/docs/api/java/lang/Integer.html#parseInt%28java.lang.String%29) drinne stehen.

"1 2 3 4".split(" ") ergibt {"1", "2", "3", "4"}.

hth, mfg
Das hat funktioniert, Danke!

Sergej
2009-12-21, 18:24:27
So, ich hab noch mal was :(


import java.io.*;

public class Tree {

public static void main(String[] args) throws IOException {

while (true)

try {

// Deklaration der Variablen
String data, data2;
int height;

// Verarbeiten der Eingabe
InputStreamReader inStream =
new InputStreamReader( System.in ) ;
BufferedReader input =
new BufferedReader( inStream );

System.out.println("Hoehe des Tannenbaums:");

// Wertzuweisung der Variablen
data = input.readLine();
height = Integer.parseInt(data);

if(height <1)
throw new IllegalArgumentException();

drawTree(height);



// Verarbeiten der Eingabe
InputStreamReader inStream2 =
new InputStreamReader( System.in ) ;
BufferedReader again =
new BufferedReader( inStream2 );

System.out.println("Noch einmal? (J/N)");

// Wertzuweisung der Variablen
data2 = again.readLine();

System.out.println("Ergebnis:" + data2);

if(data2 == "j")
;
if(data2 == "n")
System.exit(0);
else
throw new IllegalArgumentException();

break;

}

catch (IllegalArgumentException e) {

System.out.println();
System.err.println("Bitte eine natuerliche Zahl eingeben.");
System.err.println("Empfohlene Hoehe: > 3.");
System.err.println("Zum Verlassen Strg + c.");
System.out.println();
System.out.println();

}

}


Konkret dieser Teil:


System.out.println("Ergebnis:" + data2);

if(data2 == "j")
[FOLGT];
if(data2 == "n")
System.exit(0);
else
throw new IllegalArgumentException();

Nachdem drawTree ausgeführt würde, soll gefragt werden, ob dies noch einmal ausgeführt werden soll. Antwortmöglichkeiten sollen J/N sein. Aber egal, was ich eingebe, ich bekomme die IllegalArgumentException. Dabei gibt mir println für data2 sogar die korrekten Werte aus, also je nach Eingabe "j" oder "n". Und in meiner if-Bedingung greife ich diese doch eindeutig ab. Wieso greift also else, auch, wenn data2 "j" oder "n" sind?

Danke schonmal.

robobimbo
2009-12-21, 19:17:16
Strings darf man nicht per "==" vergleichen.

wenn Du zwei Strings miteinander vergelichen willst nimm die "equalsIgnoreCase" Methode aus der String klasse, also in deinem Beispiel:

data2.equalsIgnoreCase("j")

Alternativ könntest Du noch den ersten Char des String nehmen und dann diesen Char mit 'j' vergleichen (beachte aber dabei die einfachen Anführungszeichen).

Java verwendet einfache Hochkomma um Chars zu erkennen, und doppelte Hochkomma für Strings.

Gast
2009-12-21, 19:52:45
Strings darf man nicht per "==" vergleichen.

wenn Du zwei Strings miteinander vergelichen willst nimm die "equalsIgnoreCase" Methode aus der String klasse, also in deinem Beispiel:

data2.equalsIgnoreCase("j")

Alternativ könntest Du noch den ersten Char des String nehmen und dann diesen Char mit 'j' vergleichen (beachte aber dabei die einfachen Anführungszeichen).

Java verwendet einfache Hochkomma um Chars zu erkennen, und doppelte Hochkomma für Strings.


Und falls der Case doch wichtig ist, einfach meinString.equals("CaSe")

Sergej
2009-12-21, 21:15:33
Danke für die Antworten, das hat geholfen!