Frage zu try ... catch

myjday

Aktives Mitglied
Schönen guten Abend,

ich spiele gerade mit dem Verständnis zu try ... catch.

Dazu habe ich folgendes Problemchen kreiert. (JFrame mit JLabel, Jtxt, usw ...

Ein Benutzer möchte eine Datenmenge entweder auf CDs oder auf DVDs brennen. Die Auswahl trifft
er in eine JComboBox.
Als Meldung soll ausgegeben werden wie viele DVDs, bzw. CDs er benötigt.

Den Fall, dass der User keine Datenmenge eingibt wollte ich mit try ... catch abfangen.
Funktioniert aber nicht.

Hier der Quellcode, der ausgeführt werden sollte sobald der User den OK-Button drückt.

Java:
private JButton getJbtnOK() {
		if (jbtnOK == null) {
			jbtnOK = new JButton();
			jbtnOK.setBounds(new Rectangle(192, 46, 60, 20));
			jbtnOK.setText("OK");
			jbtnOK.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {

					// Start Eingabebereich

					int kapazitaetDVD = 4700;
					int kapazitaetCD =   700;

					String datentraeger1 = "CDs";
					String datentraeger2 = "DVDs";

					String meldung = "Bitte wählen Sie zuerst ein Medium aus";

					int speichermenge;

					try {
						speichermenge = Integer.parseInt(jtxtEingabe.getText());

					} catch (NumberFormatException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();

						meldung = "Sie haben keine Datenmenge eingegeben";
					}

					// Bestimmen der Ausgabe

					if (jcbbDVDCDAuswahl.getSelectedIndex() == 1) {

						if (berechneAnzahlDatentraeger(speichermenge,kapazitaetCD) == 1) {

							datentraeger1 = "CD";
						}

						meldung = "Sie benötigen " + berechneAnzahlDatentraeger(speichermenge,kapazitaetCD);
						meldung = meldung + " " + datentraeger1;
					}

					if (jcbbDVDCDAuswahl.getSelectedIndex() == 2) {

						if (berechneAnzahlDatentraeger(speichermenge,kapazitaetDVD) == 1) {

							datentraeger2 = "DVD";
						}

						meldung = "Sie benötigen "+ berechneAnzahlDatentraeger(speichermenge,kapazitaetDVD);
						meldung = meldung + " " + datentraeger2;
					}

					jlblAnzeige.setText(meldung);

					// Ende Eingabebereich
				}
			});
		}
		return jbtnOK;
	}

	public static int berechneAnzahlDatentraeger(int s, int k) {

		int anzahl = s / k;

		// Gibt es einen Rest?

		if (s % k != 0) {

			anzahl++;
		}

		return anzahl;

	}

Ohne try / catch funktioniert es.

Ideen? :noe:

Gruß,
myjday
 
nach meinem Verständnis ist es ein Compiler-Fehler.

OK, Eclipse meint dazu:

at a04_dvd_cd.A04_DVDCDOberflaeche.<init>(A04_DVDCDOberflaeche.java:157)
at a04_dvd_cd.A04_DVDCDOberflaeche$2.run(A04_DVDCDOberflaeche.java:145)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

In Zeile 157 ist der Konstruktoraufruf
in Zeile 145 wird das Objekt der Klasse versucht zu Erzeugen. Ist wahrscheinlich ein Folgefehler
zu Zeile 157.

Komischerweise (na ja - wahrscheinlich nur für mich) kennt er die lokale Variable speichermenge beim Methodenaufruf nicht mehr. Obwohl sie vor dem try / catch-Block deklariert wurde.

Gruß,
myjday
 
Was du hier als Fehlermeldung postest, sieht ehe nach einem (allerdimngs unvollständigen) Laufzeitfehler aus.

Zur Variablen speichermenge: solche Konstrukte
Java:
int x;
try {
  x = ...
} catch ( Exception e) {
  ...
}
int y = f( x);
mag der Compiler nicht, weil x möglicherweise (nämlich dann, wenn vor der Zuweisung eine Exception aufgetreten ist) nicht initialisiert worden ist.
 
zum Verständnis:
der gepostete Stacktrace beschreibt einen Fehler zur Laufzeit, alle Zeilen gehören zusammen und zeigen alle offenen Methoden an hin zur Stelle des Fehlers,
die erste Zeile eines solchen StackTraces fehlt bei dir, da steht die wichtigste Information, hier evtl 'Unresolved Compilation Problem',
denn noch dürfte der Code wirklich keinen Sinn machen, siehe Tipp von eRaaaa
 
Ihr hattet recht. sobald ich die lokale Variable speichermenge mit 0 initialisiert hatte war der Compilerfehler vom Tisch.

Allerdings ist jetzt das eigentliche Problem noch nicht gelöst.

Wenn ich den Fall eines leeren Eingabefeldes ausprobiere erhalte ich einen Laufzeitfehler. Diesen
wollte ich eigentlich mit try / catch abfangen.

java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at a04_dvd_cd.A04_DVDCDOberflaeche$1.actionPerformed(A04_DVDCDOberflaeche.java:81)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
usw.


Den gleichen Laufzeitfehler erhalte ich auch wenn ich anstatt der erwarteten Ganzzahl einen double-Wert eintrage.

java.lang.NumberFormatException: For input string: "5.6"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at a04_dvd_cd.A04_DVDCDOberflaeche$1.actionPerformed(A04_DVDCDOberflaeche.java:81)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)

Sind das überhaupt Laufzeitfehler?
Ich sollte vielleicht noch dazusagen, dass er die Zuweisung an den String meldung im catch-Block ausführt.

Sorry, aber gibt es für die entsprechenden möglich auftretenden Fehler bestimmte Kategorien, die man einzeln abfangen muss oder gibt es eine Exception stellvertretend für alle?

Gruß,
myjday
 
funktioniert doch alles. Der Code unter dem try-catch-Block wird normal ausgeführt. Du fängst die NumberFormatException erfolgreich ab.
Im catch-Block gibst du stackTrace dann aus. Deswegen sieht es für dich genauso aus, als würde die Excpetion nicht aufgefangen werden. Sie wird es aber... (kannst ja mal testweise ein System.out.println in den catch-Block und eins darunter schreiben...)
 
Zuletzt bearbeitet:
die Methode parseInt() erwartet einen String, der eindeutig einen Integer enthält.
Ein leerer String ("") und ein String,d er wie ein double aussieht ("5.6") sind nunmal keine Integer und können keinesfalls in einen Integer gewandelt werden.

Die Folge ist eine Exception, die geworfen wird. Die Exception fängst Du mit Deiner catch Anweisung ab und da Du dir den StackTrace anzeigen lässt kommt es zu exakt dieser Ausgabe.



Meiner Meinung nach ist die Art und weise wie Du das ganze löst vollkommen unpraktisch. Du solltest die Eingabe vorweg prüfen, ob überhaupt ein Integer drin ist und bei eventuell fehlerhaften Zeichen eine Meldung ausgeben. Na ja, aber grundlegend funktioniert alles so wie Du es programmiert hast.

Und selbstverständlich wird die Meldung gesetzt. Es ist halt ein Laufzeitfehler, den Du abfängst und behandelst. Dadurch läuft das Programm normal weiter. Musst halt nur bedenken, dass der Integer nicht erzeugt wurde. Eine folgende Rechenoperation kann also eventuell zu weiteren Fehlern führen.



Bezüglich der auftretenden Fehler, es gibt verschiedene Exceptions, die man gesondert abfangen und auch gesondert handhaben kann. In Deinem Fall ist das immer die NumberFormatException. Es ist aber möglich, dass in größeren Blöcken verschiedene Fehler auftreten können. Die kann man dann gesondert behandeln (sollte man auch), aber theoretisch ists möglich das allgemein abzufangen. Ein "catch (Exception e)" würde jeden möglichen Fehler abfangen. Exception ist die Oberklasse aller Fehler.
 

Neue Themen


Zurück
Oben