Exception Handling in der ActionPerformed-Methode

Status
Nicht offen für weitere Antworten.

belimo

Mitglied
Hallo Leute

Ich habe folgenden Code:
Code:
	public void paint(Graphics g) {
			g.drawString("inta: " + inta, 50, 70);
			g.drawString("intb: " + intb, 50, 90);
			g.drawString("intc: " + intc, 50, 110);
		try {
			g.drawString("Das Resultat ist: " + berechne(inta, intb, intc), 50, 50);
		} catch (NumberFormatException e3) {
			g.drawString("" + e3.getMessage(), 50, 50);
		}catch (IllegalArgumentException e1) {
			g.drawString("Fehlermeldung: " + e1.getMessage(), 50, 50);
		} catch (Exception e2) {
			g.drawString("Argumente nicht erlaubt: " + e2.getMessage(), 50, 50);
		}
	}
	
	public void actionPerformed(ActionEvent myEvent) throws NumberFormatException {
		
		
			if (myEvent.getSource() == a) {

			}
			if (myEvent.getSource() == b) {
				
			}
			if (myEvent.getSource() == c) {

			}
			if (myEvent.getSource() == senden) {	
			
		                        inta = Integer.parseInt(a.getText());
					intb = Integer.parseInt(b.getText());
					intc = Integer.parseInt(c.getText());
					repaint();
					
			}	
	}
	
	public double berechne(double a, double b, double c) {
	 	return Math.sqrt((a + b + c)*(a + b - c)*(b + c - a)*(c + a - b)) / 4;	
	}

Kurz: Ein Applet, wo ich die Fläche eines Dreiecks unter Angabe aller drei Seitenlängen berechne. Nun habe ich im actionPerformed ja die Methode parseInt, welche wenn statt einer Zahl ein Text übergeben wird eine NumberFormatException wirft. Soweit so gut.

Mein Problem ist nun: Wie fange ich das genau ab? Ich könnte um diesem Block:
Code:
					inta = Integer.parseInt(a.getText());
					intb = Integer.parseInt(b.getText());
					intc = Integer.parseInt(c.getText());
					repaint();
mit try und catch arbeiten, aber im catch kann ich ja gar keine Fehlermeldung ausgeben. Das geht ja nur im Paint. Hoffe ihr versteht was ich meine ;-)

Danke schonmal für eure Hilfe.
 
Ganz böse.
In paint wird gezeichnet, nicht gerechnet.
paint bildet nur den Ist-Zustand ab, die Berechnung muss schon vorher passiert sein.
 
Na gut 😀 Ich habs mal angepasst:

Code:
import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class praktikum72 extends Applet implements ActionListener {
	
	private TextField a = null, b = null, c = null;
	private Button senden;
	private int inta, intb, intc;
	private double result;
	
	public void init() {
				
		 a = new TextField("0", 6);
		 b = new TextField("0", 6);
		 c = new TextField("0", 6);
		 
		 senden = new Button("Sende zum Berechnen!");
		 
		 add(a); add(b); add(c); add(senden);
		 
		 a.addActionListener(this);
		 b.addActionListener(this);
		 c.addActionListener(this);
		 senden.addActionListener(this);
		
	}

	public void paint(Graphics g) {
			g.drawString("inta: " + inta, 50, 70);
			g.drawString("intb: " + intb, 50, 90);
			g.drawString("intc: " + intc, 50, 110);
		try {
			g.drawString("Das Resultat ist: " + result, 50, 50);
		} catch (NumberFormatException e3) {
			g.drawString("Sie haben keine Zahl eingegeben!", 50, 50);
		}catch (IllegalArgumentException e1) {
			g.drawString("Fehlermeldung: " + e1.getMessage(), 50, 50);
		} catch (Exception e2) {
			g.drawString("Argumente nicht erlaubt: " + e2.getMessage(), 50, 50);
		}
	}
	
	public void actionPerformed(ActionEvent myEvent) throws NumberFormatException {
			if (myEvent.getSource() == senden) {	
					inta = Integer.parseInt(a.getText());
					intb = Integer.parseInt(b.getText());
					intc = Integer.parseInt(c.getText());
					result = berechne(inta, intb, intc);
					repaint();		
			}	
	}
	
	public double berechne(double a, double b, double c) {
	 	return Math.sqrt((a + b + c)*(a + b - c)*(b + c - a)*(c + a - b)) / 4;	
	}
	
}

Aber mein Problem bleibt: Wie fange ich denn die NumberFormatException ab? Die hat ja im Prinzip nichts zu tun mit der berechnen-Methode, sondern mit der parseInt. Ich bin absoluter Anfänger in Exception, wir hatten erst grade die Vorlesung ;-) Daher bin ich dankbar um jeden noch so banal erscheinenden Tip.
 
Das Abfangen der Exception ist einfach; die Frage
ist, was du bei einer Exception machen willst?

Beispiel
Code:
try {
  inta = Integer.parseInt(a.getText()); 
  intb = Integer.parseInt(b.getText()); 
  intc = Integer.parseInt(c.getText());  
  result = berechne(inta, intb, intc); 
  repaint();      
} catch (NumberFormatException e) {
  JOptionPane.showMessageDialog(null, "Fehler", e.toString(), JOptionPane.ERROR_MESSAGE);
}
 
Dankeschön.

Das Abfangen wäre jetzt also geklärt. Ich möchte nun beim Fehler eine Fehlermeldung ausgeben (aber über die Paintmethode.)

Statt wie bei dir: "JOptionPane.showMessageDialog(null, "Fehler", e.toString(), JOptionPane.ERROR_MESSAGE);" soll im Paint das hier stehen: "g.drawString("Sie haben keine Zahl eingegeben!", 50, 50);"

Aber im ActionPerformed kann ich ja mit drawString nichts ausgeben ;-) Ich könnte höchstens im von dir geposteten catch eine Fehlermeldung in eine String-Variable schreiben und diese im Paint dann ausgeben. Aber ist das sauber? Wie machen das denn die Profis?
 
Code:
public class praktikum72 extends Applet implements ActionListener { 
  private errorString;
  ...
   public void paint(Graphics g) { 
      if (errorString != null)
        g.drawString(errorString, 50, 70);
      else {
         g.drawString("inta: " + inta, 50, 70); 
         g.drawString("intb: " + intb, 50, 90); 
         g.drawString("intc: " + intc, 50, 110); 
         g.drawString("Das Resultat ist: " + result, 50, 50); 
      } 
   } 
    
   public void actionPerformed(ActionEvent myEvent) throws NumberFormatException { 
         if (myEvent.getSource() == senden) {    
               errorString = null;
               try {
                 inta = Integer.parseInt(a.getText()); 
                 intb = Integer.parseInt(b.getText()); 
                 intc = Integer.parseInt(c.getText()); 
                 result = berechne(inta, intb, intc); 
               } catch (NumberFormatException e) {
                 errorString = "Sie haben keine Zahl eingegeben: " + e.toString();
               }
                 repaint();       
         }    
   }
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben