Input/Output Einlesen funktioniert nur teilweise

nczrfss

Neues Mitglied
Hallo.
Ich bin blutiger Anfänger mit Java und habe ein Problem,
bei dem ich absolut nicht weiter weiß. Und zwar sollen wir vom Informatikunterricht einen Taschenrechner mit dem WindowBuilder programmieren. Das einlesen der ersten Zahl, die man über Buttons eingeben kann, funktioniert auch so weit, jedoch will Java die zweite Zhal partout nicht einlesen. Ich sitze jetzt seit einer gefühlten Ewigkeit vor meinem Quellcode und kann mir selbst nicht helfen. Der Fehler muss darin liegen, dass er "z2" einfach nicht bekommt, aber ich weiß nicht warum, weil es bei "z1" ja klappt.
Der Fehler sollte bei Z160 liegen, da die Meldung erscheint: Fehler2.zahl .

Java:
package trechner;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

public class TR1 extends JFrame {

	private JPanel contentPane;
	private JTextField textField;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					TR1 frame = new TR1();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public TR1() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBackground(Color.LIGHT_GRAY);
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		textField = new JTextField();
		textField.setBounds(10, 11, 392, 52);
		contentPane.add(textField);
		textField.setColumns(10);

		JButton button = new JButton("1");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				String s = textField.getText();
				textField.setText(s + 1);
			}
		});

		 // 2 -0 ist jetzt rausgeschnitten der Kürze halber

		button_8.setBounds(7, 176, 89, 23);
		contentPane.add(button_8);

		JButton btnClear = new JButton("Clear");
		btnClear.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				String s = textField.getText();
				textField.setText("");
			}
		});
		btnClear.setBounds(313, 210, 89, 23);
		contentPane.add(btnClear);

		JButton btnNewButton_1 = new JButton("+");
		btnNewButton_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				String s = textField.getText();
				textField.setText(s + "+");
			}
		});
		btnNewButton_1.setBounds(313, 74, 89, 23);
		contentPane.add(btnNewButton_1);

		JButton button_9 = new JButton("-");
		button_9.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				String s = textField.getText();
				textField.setText(s + "-");
			}
		});
		button_9.setBounds(313, 108, 89, 23);
		contentPane.add(button_9);

		JButton button_10 = new JButton("*");
		button_10.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				String s = textField.getText();
				textField.setText(s + "*");
			}
		});
		button_10.setBounds(313, 176, 89, 23);
		contentPane.add(button_10);

		JButton button_11 = new JButton("/");
		button_11.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				String s = textField.getText();
				textField.setText(s + "/");
			}
		});
		button_11.setBounds(313, 142, 89, 23);
		contentPane.add(button_11);

		JButton button_12 = new JButton("=");
		button_12.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				String s = textField.getText();
				textField.setText(s + "=");
				char a = 0, r = 0, g = 0;
				String z1 = "", z2 = "";
				int merker1 = 0, merker2 = 0;
				double zahl1 = 0, zahl2 = 0, ergebnis = 0;
				for (int i = 0; i < s.length(); i++) {
					a = s.charAt(i);
					if (a == '+') {
						merker1 = i;
						r = '+';
					}
					if (a == '-') {
						merker1 = i;
						r = '-';
					}
					if (a == '*') {
						merker1 = i;
						r = '*';
					}
					if (a == '/') {
						merker1 = i;
						r = '/';
					}
					if (a == '=') {
						merker2 = i;
						g = '=';
					}
				}
				for (int i = 0; i < merker1; i++) {
					z1 = z1 + s.charAt(i);
				}
				for (int i = merker2 + 1; i < merker2; i++) {
					z2 = z2 + s.charAt(i);
				}
				System.out.println("1.Zahl : " + z1 + "  2.Zahl : " + z2);
				try {
					zahl1 = Double.parseDouble(z1);
				} catch (Exception e) {
					System.out.println("Fehler bei der Eingabe!");
				}
				try {
					zahl2 = Double.parseDouble(z2);
				} catch (Exception e) {
					System.out.println("fehler2.zahl");
				}
				if (r == '+') {
					ergebnis = zahl1 + zahl2;
					System.out.println("Ergebnis : " + ergebnis);
				} else if (r == '-') {
					ergebnis = zahl1 - zahl2;
					System.out.println("Ergebnis : " + ergebnis);
				} else if (r == '*') {
					ergebnis = zahl1 * zahl2;
					System.out.println("Ergebnis : " + ergebnis);
				} else if (r == '/') {
					ergebnis = zahl1 / zahl2;
					System.out.println("Ergebnis : " + ergebnis);
				} else {
					System.out.println("Fehlerhafte Eingabe!");
				}
			}

		});
		button_12.setBounds(205, 176, 89, 23);
		contentPane.add(button_12);

		JButton button_13 = new JButton(".");
		button_13.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				String s = textField.getText();
				textField.setText(s + ".");
			}
		});
		button_13.setBounds(106, 176, 89, 23);
		contentPane.add(button_13);
	}
}

Ich danke euch im Vorraus!
LG und Frohe Ostern
 
Hmm... wie wäre es wenn du den String von textField.getText() an einer Leertaste splittest und vor und nach jedem Operator ein " " packst (also: z.B: textField.setText(s + " + ");
Das splitten übernimmt die Methode String.split:
[Java]//ein Beispiel, im textField steht jetzt "5 + 6" ( die Leertasten sind wichtig!)
String s = textField.getText();
// die Methode Split erwartet als Parameter einen String an dessen Stelle gesplittet/der Sting zerteilt werden soll und gibt dem //entsprechend dann ein StringArray zurück
String[] mySplitResult = s.split(" ");
//mySplitResult[0]=="5", mySplitResult[1]=="+", mySplitResult[2]=="6".[/Java]

Alternativ kannst du auch gleich den ganzen String mit einer Klasse ausrechnen, ich besitze so eine (ist aber nicht perfekt):
[Java]/**
* throws NumberFormatException,IndexOutOfBoundsException
*
* Description:
*This class includes the method evaluate(String)
*that evaluates the argument,
*but the argument need space(" ") between operators and values!
*
*can only evaluate the following operators:
* + - * / ( )
*
*
* @version 21.03.2015
* @author DieKeksmaffia
*/
public class OwnCalculator
{
public OwnCalculator(){

}
@SuppressWarnings({ "null", "unused" })
public double evaluate(String arg) throws NumberFormatException, IndexOutOfBoundsException{

ArrayList<Double> allValues = new ArrayList<Double>();
ArrayList<Short> allOperators = new ArrayList<Short>();
String[] myResult = arg.split(" ");

String contendOfBrackets = "";
short numberOfInnerBrackets = 0;
boolean currentInBracket = false;

//adds the values/operators to the ArrayList, Brackets get evaluated by using recursion
CheckForBrackets: for (int i = 0; i<myResult.length;i++){
decide: switch(myResult) {

case "(": if(currentInBracket==true)contendOfBrackets=contendOfBrackets+" "+myResult+" ";
else currentInBracket=true;
numberOfInnerBrackets++;
break decide;

case ")": if(currentInBracket==false) return (Double)null;
numberOfInnerBrackets--;
if (numberOfInnerBrackets==0){
currentInBracket=false;
allValues.add(evaluate(contendOfBrackets));
contendOfBrackets="";
}
else contendOfBrackets=contendOfBrackets+" "+myResult+" ";
break decide;

case "+": if(currentInBracket==true){contendOfBrackets=contendOfBrackets+" "+myResult+" ";}
else allOperators.add((short) 1); break decide;


case "-": if(currentInBracket==true){contendOfBrackets=contendOfBrackets+" "+myResult+" ";}
else allOperators.add((short) 2); break decide;

case "*": if(currentInBracket==true){contendOfBrackets=contendOfBrackets+" "+myResult+" ";}
else allOperators.add((short) 3); break decide;

case "/": if(currentInBracket==true){contendOfBrackets=contendOfBrackets+" "+myResult+" ";}
else allOperators.add((short) 4); break decide;

case " ": break;
case "": break;

default : if(currentInBracket==true)contendOfBrackets=contendOfBrackets+myResult;
else allValues.add(Double.parseDouble(myResult));
break decide;

}
}
//evaluates the the values and operators of "*" and "/"
for(int i = 0; i<allOperators.size(); i++)
{
switch(allOperators.get(i)){
case 3: allValues.set(i, (allValues.get(i)*allValues.get(i+1)));
allValues.remove(i+1);
allOperators.remove(i);
break;
case 4: allValues.set(i, (allValues.get(i)/allValues.get(i+1)));
allValues.remove(i+1);
allOperators.remove(i);
break;
}
}
//evaluates the left values and operators that has to be "+" or "-"
//from right to left of the parameter String and saves it in the double result
double result = allValues.get(0);
for(int i = 0; i<allOperators.size();i++)
{
switch(allOperators.get(i)){
case 1:result=result+allValues.get(i+1);break;
case 2:result=result-allValues.get(i+1);break;
}
}
//if the given String is calculable everything should work and the methods returns the result
return result;
}

}
[/Java]
 
Zuletzt bearbeitet:
Hi,

ich hab zwar nicht alles angesehen aber folgender Codeabschnitt kann eigentlich nie ausgeführt werden:
Java:
for (int i = merker2 + 1; i < merker2; i++) {
					z2 = z2 + s.charAt(i);
				}

Angenommen merker2 sei 10. Dann ist i=11, und somit gilt i < merker2 nie, dementsprechend wird dieser Code nicht ausgeführt.

Es handelt sich hierbei ja um folgenden vereinfachten Code:
Java:
public class JavaForum {

	public static void main(String[] args){
		
		int x=0;
		for(int i=x+1; i<x;i++){
			System.out.println("geht's?");
		}
		System.out.println("nö");

	}
}
... wenn ich micht nich irre. 😉

LG
 
Zuletzt bearbeitet:

Zurück
Oben