Code stoppen

Status
Niet open voor verdere reacties.

Creator1

Gebruiker
Lid geworden
10 feb 2011
Berichten
235
Hoe kan je uit een class breken? Ik heb een programma waarbij een uitzondering kan optreden (delen door nul, zonder dat je een exception krijgt, wat sowieso al raar is), en als die uitzondering optreed wil ik dat er een aantal dingen geberuen (een duidelijke error geven, onder andere), en daarna uit de ActionHandler class, waarin hij bezig was, gaan om weer terug te gaan naar de constructor van m'n GUI (De ActionHandler class zit in dezelfde class als de constructor van de GUI waarvan het een anonieme subclass is).
Kortom, is het mogelijk UIT een class te breken (of uit de methode, het programma, enz...) en dan op een ander punt verder te gaan?
 
Heyhey,

Ik ben lichtelijk verward door wat je zegt.
Wat je waarschijnlijk niet wil doen is terug gaan naar de constructor van je object.
Dit gaat er namelijk voor zorgen dat er nog een object word gecreëerd op het moment dat je wat fout doet (ik zie de OverflowError's al voor me).

Mogelijk interpreteer ik iets heel erg verkeerd, dus ik zou graag hebben dat je je code post.

Kijk hier eens naar, misschien heb je er wat aan:
http://docs.oracle.com/javase/tutorial/essential/exceptions/throwing.html

of gewoon de gehele JavaDocs over Exceptions (gaat zeker helpen)
http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html

Als je nog meer hulp nodig hebt hoor ik het graag,
dan met code als dat even kan!

Met vriendelijke groet,
Rhythmic.
 
Haha, ik kan me goed voorstellen dat je verward was. Ik vond het zelf allemaal ook wat moeilijk uit te leggen.

Maar goed, ik wil inderdaad niet een nieuw object met die constructor aanmaken. Dat is juist wat ik ook wil voorkomen. Ik maak een rekenmachine die bestaat uit twee klassen (Main en GUI) en drie subklassen in GUI (OperatorHandler, SpecialButtonsHandler en ClearHandler). Mijn probleem is dat als je gaat delen door 0, je als antwoord ∞ krijgt. Dit wil ik eruit halen zonder dat ik een exception wil geven. Ik vang de fout dus af (met try en catch) en als de fout optreed wil ik dat de code waar hij mee bezig is meteen stopt en dat de rekenmachine in feite reset.

Hier is de code:
Klasse Main:
Code:
package org.calculator;

import javax.swing.*;

public class Main {	
	
	public static void main(String[] args) {
		
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (Exception e) {
			
		}
		
		GUI calc = new GUI();
		calc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		calc.setSize(215,235);
		calc.setVisible(true);
		calc.setResizable(false);
		calc.setLocation(350, 200);
		
	}
	
}

Klasse GUI (met subklassen):
Code:
package org.calculator;

import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;

import javax.swing.*;

@SuppressWarnings("serial")
public class GUI extends JFrame {
	
	//fonts
	private static final Font ANSWER_FONT = new Font("monspaced", Font.PLAIN, 20);
	private static final Font BUTTON_FONT =	new Font("monspaced", Font.PLAIN, 13);
	//numbers
	private JButton b1;
	private JButton b2;
	private JButton b3;
	private JButton b4;
	private JButton b5;
	private JButton b6;
	private JButton b7;
	private JButton b8;
	private JButton b9;
	private JButton b0;
	//math operators
	private JButton addBtn;
	private JButton substractBtn;
	private JButton multiplyBtn;
	private JButton divideBtn;
	//other operators
	private JButton plusMinus;
	private JButton dot;
	private JButton backspace;
	private JButton clear;
	private JButton clearEntry;
	private JButton equalsBtn;
	//answer field
	private JTextField answerField;
	@SuppressWarnings("unused")
	private JTextField sumField;
	//panels
	private JPanel buttonPanel;
	private JPanel operatorPanel;
	private JPanel content;
	
	//HandlerClass variables
	public static String inputString = "0";
	public static String answer;
	
	public double number1;
	public double number2;
	public int firstEntry = 0;
	public boolean answerOnScreen = false;
	public String lastOperator;
	public String outputString;

	
	public DecimalFormat outputFormat = new DecimalFormat("#.######");
	
	//MainGUI constructor
	public GUI() {
		super("Calculator");
		
		//answer field		
		answerField = new JTextField("0");
		answerField.setFont(ANSWER_FONT);
		answerField.setHorizontalAlignment(JTextField.RIGHT);
		answerField.setBackground(Color.WHITE);
		answerField.setEditable(false);
		
		
		
		//ButtonPanel
		buttonPanel = new JPanel();
		buttonPanel.setLayout(new GridLayout(5, 3, 2, 2));
		
		//- Clear, clear entry and backspace buttons
		clear = new JButton("C");
		clear.setFont(BUTTON_FONT);
		buttonPanel.add(clear);
		
		clearEntry = new JButton("CE");
		clearEntry.setFont(BUTTON_FONT);
		buttonPanel.add(clearEntry);
		
		backspace = new JButton("<--");
		backspace.setFont(BUTTON_FONT);
		buttonPanel.add(backspace);
		//- numeric buttons
		b1 = new JButton("7");
		b1.setFont(BUTTON_FONT);
		buttonPanel.add(b1);
		
		b2 = new JButton("8");
		b2.setFont(BUTTON_FONT);
		buttonPanel.add(b2);
		
		b3 = new JButton("9");
		b3.setFont(BUTTON_FONT);
		buttonPanel.add(b3);
		
		b4 = new JButton("4");
		b4.setFont(BUTTON_FONT);
		buttonPanel.add(b4);
		
		b5 = new JButton("5");
		b5.setFont(BUTTON_FONT);
		buttonPanel.add(b5);
		
		b6 = new JButton("6");
		b6.setFont(BUTTON_FONT);
		buttonPanel.add(b6);
		
		b7 = new JButton("1");
		b7.setFont(BUTTON_FONT);
		buttonPanel.add(b7);
		
		b8 = new JButton("2");
		b8.setFont(BUTTON_FONT);
		buttonPanel.add(b8);
		
		b9 = new JButton("3");
		b9.setFont(BUTTON_FONT);
		buttonPanel.add(b9);		
		//period, negation and zero buttons
		plusMinus = new JButton("+/-");
		plusMinus.setActionCommand("plusMinus");
		plusMinus.setFont(BUTTON_FONT);
		buttonPanel.add(plusMinus);
		
		b0 = new JButton("0");
		b0.setFont(BUTTON_FONT);
		buttonPanel.add(b0);
		
		dot = new JButton(",");
		dot.setActionCommand("dot");
//		dot.setEnabled(false);
		dot.setFont(BUTTON_FONT);
		buttonPanel.add(dot);
		
		//operation buttons (OperatorPanel)
		operatorPanel = new JPanel();
		operatorPanel.setLayout(new GridLayout(5, 1, 2, 2));
		
		addBtn = new JButton("+");
		b1.setFont(BUTTON_FONT);
		operatorPanel.add(addBtn);
		
		substractBtn = new JButton("-");
		b1.setFont(BUTTON_FONT);
		operatorPanel.add(substractBtn);
		
		multiplyBtn = new JButton("x");
		b1.setFont(BUTTON_FONT);
		operatorPanel.add(multiplyBtn);
		
		divideBtn = new JButton(":");
		b1.setFont(BUTTON_FONT);
		operatorPanel.add(divideBtn);
		
		equalsBtn = new JButton("=");
		b1.setFont(BUTTON_FONT);
		operatorPanel.add(equalsBtn);
		
		//content
		content = new JPanel();
		content.setLayout(new BorderLayout(5,5));
		content.add(operatorPanel, BorderLayout.EAST);
		content.add(answerField, BorderLayout.NORTH);
		content.add(buttonPanel, BorderLayout.CENTER);
		
		content.setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
		add(content);
		
		
		//Event handler
		//operatorHandler
		OperatorHandler operatorHandler = new OperatorHandler();
		addBtn.addActionListener(operatorHandler);
		substractBtn.addActionListener(operatorHandler);
		multiplyBtn.addActionListener(operatorHandler);
		divideBtn.addActionListener(operatorHandler);
		equalsBtn.addActionListener(operatorHandler);
		//numberHandler
		NumberHandler numberHandler = new NumberHandler();
		b1.addActionListener(numberHandler);
		b2.addActionListener(numberHandler);
		b3.addActionListener(numberHandler);
		b4.addActionListener(numberHandler);
		b5.addActionListener(numberHandler);
		b6.addActionListener(numberHandler);
		b7.addActionListener(numberHandler);
		b8.addActionListener(numberHandler);
		b9.addActionListener(numberHandler);
		b0.addActionListener(numberHandler);
		//specialHandler
		SpecialButtonsHandler specialButtonsHandler = new SpecialButtonsHandler();
		plusMinus.addActionListener(specialButtonsHandler);
		dot.addActionListener(specialButtonsHandler);
		//clearHandler
		ClearHandler clearHandler = new ClearHandler();
		clear.addActionListener(clearHandler);
		clearEntry.addActionListener(clearHandler);
		backspace.addActionListener(clearHandler);
		
	}
	
	private class OperatorHandler implements ActionListener {
		
		public void actionPerformed(ActionEvent event) {
			if (answerOnScreen == true) {
				number1 = Double.valueOf(outputString);
				firstEntry = 1;
				lastOperator = event.getActionCommand();
				
			}
			if (firstEntry == 0 && event.getActionCommand() != "=") {
				number1 = Double.valueOf(inputString);
				
				lastOperator = event.getActionCommand();
				firstEntry++;
				inputString = "0";
				dot.setEnabled(true);
				
			} else if (event.getActionCommand().equals("=") && lastOperator != null) {
				number2 = Double.valueOf(inputString);
				
				if (lastOperator.equals("+")) {
					number1 = number1 + number2;
					
				} else if (lastOperator.equals("-")) {
					number1 = number1 - number2;
					
				} else if (lastOperator.equals("x")) {
					number1 = number1 * number2;
					
				} else if (lastOperator.equals(":")) {
					number1 = number1 / number2;
					
				}
				
				outputString = outputFormat.format(number1);
				number1 = 0;
				number2 = 0;
				firstEntry = 0;
				
				answerOnScreen = true;
				inputString = "0";
				answerField.setText(outputString);
				dot.setEnabled(true);
					
			} else if (firstEntry >= 1) {
				number2 = Double.valueOf(inputString);
				
				if (lastOperator.equals("+")) {
					number1 = number1 + number2;
					
				} else if (lastOperator.equals("-")) {
					number1 = number1 - number2;
					
				} else if (lastOperator.equals("x")) {
					number1 = number1 * number2;
					
				} else if (lastOperator.equals(":")) {
					try {
						number1 = number1 / number2;
						
					} catch (ArithmeticException e) {
                                                ///////////////////////////////
						///[B][I][U]Hier moet de code stoppen[/U][/I][/B]///
                                                ///////////////////////////////
						
					}
					
				}
				
				lastOperator = event.getActionCommand();
				
				answerOnScreen = false;
				inputString = "0";
				outputString = outputFormat.format(number1);
				answerField.setText(outputString);
				dot.setEnabled(true);
				
			}
			
		}
		
	}
	
	private class NumberHandler implements ActionListener {

		public void actionPerformed(ActionEvent event) {
			answerOnScreen = false;
			if (event.getActionCommand().equals(".")) {
				if (inputString != "0") {
					inputString += event.getActionCommand();
					try {
						@SuppressWarnings("unused")
						float testInputString = Float.valueOf(inputString);
						
					} catch (NumberFormatException e) {
						dot.setEnabled(false);
						
					}
					answerField.setText(inputString);
					
				}
				
			} else {
				if (inputString == "0")
					inputString = "";
				inputString += event.getActionCommand();		
				answerField.setText(inputString);
				
			}
			
		}
		
	}
	
	private class SpecialButtonsHandler implements ActionListener {
		
		public void actionPerformed(ActionEvent event) {
			if (event.getActionCommand() == "dot") {
				if (inputString != "0") {
					inputString += ".";
					
					dot.setEnabled(false);
					answerField.setText(inputString);
				}
				
			} else if (event.getActionCommand() == "plusMinus") {
				if (inputString != "0") {
					if (inputString.charAt(0) != '-') {
						StringBuffer inputString_buffer = new StringBuffer();
						inputString_buffer.append("-");
						inputString_buffer.append(inputString);
							
						inputString = inputString_buffer.toString();			
					
					} else {
						StringBuffer inputString_buffer = new StringBuffer();
						inputString_buffer.append(inputString);
						inputString_buffer.deleteCharAt(0);
							
						inputString = inputString_buffer.toString();
						
					}
					
					answerField.setText(inputString);
					
				}
				
			}
			
		}
		
	}
	
	private class ClearHandler implements ActionListener {
		
		public void actionPerformed(ActionEvent event) {
			//select which clear action is selected:
			//Clear action
			if (event.getActionCommand().equalsIgnoreCase("C")) {
				//set inputString to 0, empty numberList (NumberPerformerClass) and enable dot button
				lastOperator = "";
				firstEntry = 0;
				
				answerOnScreen = false;
				inputString = "0";
				answerField.setText(inputString);
				dot.setEnabled(true);
			}
			//Clear Entry action
			else if (event.getActionCommand().equalsIgnoreCase("CE")) {
				//set inputString to 0, enable dot button
				answerOnScreen = false;
				inputString = "0";
				answerField.setText(inputString);
				dot.setEnabled(true);
			}
			//Backspace action
			else if (event.getActionCommand().equals("<--")) {
				//catch exception StringIndexOutOfBoundsException
				try {
					//create a new StringBuffer and add inputString to it
					StringBuffer inputString_buffer = new StringBuffer();
					inputString_buffer.append(inputString);
					//if the stringBuffer's length minus 1 is 0 or below (it will never go below zero), which means that there is only one digit displayed, then set inputString to 0
					if (inputString_buffer.length() - 1 == 0) {
						inputString = "0";
					} else { 
						//the length is greater than 0, it will remove the last char and set inputString to the new StringBuffer's value as long as the last character isn't '.'
						if (inputString_buffer.charAt(inputString_buffer.length() - 1) != '.') {
							inputString_buffer.deleteCharAt(inputString_buffer.length() - 1);
							inputString = inputString_buffer.toString();
						} else { 
							//last char is '.', it will enable the dot button again
							dot.setEnabled(true);
							inputString_buffer.deleteCharAt(inputString_buffer.length() - 1);
							inputString = inputString_buffer.toString();
						}
					}
					//set the answer display to the newly obtained inputString
					answerField.setText(inputString);
				}
				//exception occurred, inputString = 0
				catch (StringIndexOutOfBoundsException e) {
					inputString = "0";
					answerField.setText(inputString);
				}
				
			}
			
		}
		
	}
	
}

Zie lijn 275 van de klasse GUI (als je de code in een teksteditor zou plakken)
Hier wil ik dat hij niet doorgaat naar alle dingen die na deze lijn nog staan, maar hij moet zich in plaats daarvan resetten of opnieuw beginnen op welke manier dan ook, alsof je op clear zou drukken. Hij moet wel even een error laten zien op zijn schermpje.

Ik hoop dat je hier wat mee kan.
Creator1

P.S. Deze code is nog niet optimaal; er zitten nog wel wat storende bugs in
 
Delen door 0 is onmogelijk, vandaar dat er een exception gegeven wordt.

Het is beter om te controleren of de gebruiker wilt delen door 0 i.p.v. gelijk de berekening uit te voeren en het te onderscheppen met try; catch.
 
Het rare is dat er dus geen exception komt als je door 0 deelt.
Maar nu heb ik nog steeds niet een echt antwoord op mijn vraag: hoe kan je de code stoppen (als dit al kan)?
 
Hoe ik zou oplossen is de gebruiker verbieden om delen door 0 te doen
door telkens na te gaan of de waarde waarbij de gebruiker wilt delen gelijk is aan 0.
Als da zo is een foutmelding geven en uit die loop springen/negeren met ofwel "continue" of "break" (continue negeer die de input, break springt uit de loop)
Ik ga ervan uit dat je een do while gebruikt om input aan u gebruiker te vragen zolang hij geen bepaalde waarde ingeeft (bv 9999)

En om u op u vraag te beantwoorden :
als je loops gebruikt kan je u code beëindigen door break of return
en als je geen loops gebruikt door return en System.exit(1) (die laatste raad ik niet aan, aangezien het u hele programma beëindigt )
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan