Erste Schritte Ausnahme NullPointerExeption

Pio

Mitglied
Hallo zusammen,

ich habe eine Verständnisfrage zu Exception bzw. zum NullPointerException. Ich habe ein einfaches Programm erstellt. Hier sollen nur zwei Eingaben (ein int, ein double) gemacht werden. Diese werden als erstes in ein String gespeichert, dann in ein int umgewandelt. Dafür habe ich verschiedene Klassen angelegt. Es sollt einmal beim Einlesen (einlesen()) überprüft werden, ob der Eingabedialog abgebrochen worden ist. Wenn nicht, soll der Wert in der Methode einlesen() in ein int umgewandelt werden. Wenn ja, Abbruch des Programms.

Folgender Quellcode:

MAIN:
Java:
import javax.swing.JOptionPane;
import eingabedialog.AbbruchException;
import eingabedialog.EingabeDialog;

public static void main(String[] args)throws AbbruchException
    {
    int intWert = 0;
    double doubleWert = 0;
    //der Aufruf der Methode einlesen() mit einem
    //int-Typen
        intWert = EingabeDialog.einlesen(intWert);
        JOptionPane.showMessageDialog(null,"Ihre Eingabe war " + intWert);
       
    //der Aufruf der Methode einlesen() mit einem
    //double-Typen
        doubleWert = EingabeDialog.einlesen(doubleWert);
        JOptionPane.showMessageDialog(null,"Ihre Eingabe war " + doubleWert);


    }

EINGABEKLASSEN:
Java:
package eingabedialog;


import javax.swing.JOptionPane;

public class EingabeDialog
{
//Eingabe über einen Dialog
private static String lesen(String text) throws AbbruchException
    {
    String eingabeTemp = null;
    boolean gelungen = false;

    while(gelungen == false)
        try
            {
            eingabeTemp = JOptionPane.showInputDialog(null, "Bitte geben Sie einen " + text + " Wert ein:");
            gelungen = true;
            }
        catch (NullPointerException e)
            {
                throw new AbbruchException("Eingabe wurde abgebrochen!");
                //JOptionPane.showMessageDialog(null, "Ihre Eingabe war nicht gültig. Bitte wiederholen...");
            }

    return eingabeTemp;
    }

//die überladene Methode einlesen() für den Typ int
public static int einlesen(int wert) throws AbbruchException
    {
    int wertTemp = 0;
    boolean gelungen = false;
    String eingabeTemp;

        while (gelungen == false)
        {
            eingabeTemp = lesen("int");
           
            try
                {
                    wertTemp = Integer.parseInt(eingabeTemp);
                    gelungen = true;
                }
            catch (NumberFormatException e)
                {
                    JOptionPane.showMessageDialog(null, "Ihre Eingabe war nicht gültig. Bitte wiederholen...");
                }

        }
    return wertTemp;
    }

//Einlesen für double-Wert
public static double einlesen(double wert)throws AbbruchException
    {
    double wertTemp = 0;
    boolean gelungen = false;
    String eingabeTemp = null;
   
        while(gelungen == false)
        {
        eingabeTemp = lesen("double");
   
            try
                {
                    wertTemp = Double.parseDouble(eingabeTemp);
                    gelungen = true;
                }
            catch (NumberFormatException e)
                {
                    JOptionPane.showMessageDialog(null, "Ihre Eingabe war nicht gültig. Bitte wiederholen .....!");
                }
   
        }
    return wertTemp;
    }

}

SELBSTERSTELLE AUSNAHME:
Java:
package eingabedialog;

public class AbbruchException extends Exception
{
    /**
     *
     */
    private static final long serialVersionUID = 1L;
   
    //Konstruktor
    AbbruchException()
    {
        super();
    }
   
    //Konstruktor mit Textübergabe
    AbbruchException(String meldung)
    {
        super(meldung);
    }

}

Bei der Methode einlesen() gehe ich davon aus, dass bei der Eingabe (Zeile 17 - Wert wird in String eingabeTemp gespeichert) bei einem Abbruch über die catch-Anweisung (Zeile 20) über die selbsterstellte Ausnahme (AbbruchException) die Ausgabe "Eingabe wurde abgebrochen!" ausgeben wird. Als Wert kommt für den String eingabeTemp NULL, wenn der Eingabedialog abgebrochen wird. Das sollte doch reichen, damit ich die catch-Anweisung ausgeführt wird oder nicht?

Stattdessen wird "jeder" Wert einfach an die nächste Methode übergeben und weiter verarbeitet. Ich weiß nicht, wie ich in der Methode lesen() nur das Abbrechen also Ausnahme rausfiltern kann.

Danke!
 

Joose

Top Contributor
In deiner Methode lesen(String) fängst du zwar eine NullPointerException, dass bringt aber nichts. Da der Code im try Block keine NullPointer verursachen kann.
Wenn du die Eingabe einer Zahl über JOptionPane abbrichst dann fliegt keine NullPointerException sonder der Rückgabewert ist einfach null (oder ein leerer String, da bin ich mir gerade nicht sicher).

EDIT:
Als Wert kommt für den String eingabeTemp NULL, wenn der Eingabedialog abgebrochen wird. Das sollte doch reichen, damit ich die catch-Anweisung ausgeführt wird oder nicht?
Nein eine Exception kann nur dann gefangen werden wenn irgendwo im try-Block eine geworfen wird. Nur weil eine Variable auf null gesetzt wird, wird noch keine Exception geworfen.

Stattdessen wird "jeder" Wert einfach an die nächste Methode übergeben und weiter verarbeitet. Ich weiß nicht, wie ich in der Methode lesen() nur das Abbrechen also Ausnahme rausfiltern kann.
Dann prüfe doch einfach mittels if-Bedingung ob ein Wert gesetzt wurde oder eingabeTemp noch null ist. In den beiden einlesen Methoden fängst du diese Exception einfach auf.

Java:
private static String lesen(String text) throws AbbruchException
{
   String eingabeTemp = JOptionPane.showInputDialog(null, "Bitte geben Sie einen " + text + " Wert ein:");
   if(eingabeTemp == null) {
     throw new AbbruchException("Eingabe wurde abgebrochen!");
   }
   return eingabeTemp;
}
 

Pio

Mitglied
Vielen Dank für deine schnelle Antwort. Im groben schon verstanden. Nur hab ich noch Probleme mit dem Auslösen bei einem Abbruch. Dein Code-Beispiel ist super.

Ich muss gestehen, dass ich hier eine Aufgabe bewältigen soll. Und zwar Ausgangsposition ist genau dein Code-Beispiel. Der Vergleich Variable == null soll durch eine Ausnahmebehandlung ersetzt werden.

Ich habe halt das Problem, dass ich den zurückgelieferten Wert nicht in eine Ausnahmebehandlung umsetzen kann (in der Methode lesen()). Ich habe gleich unter (Zeile 17 eingabeTemp = JOptionPane.showInputDialog(null, "Bitte geben Sie einen " + text + " Wert ein:");) als Ausgabe -> System.out.println("ET: " + eingabeTemp); <- hintergehängt, um zusehen was eingabeTemp mir für einen Wert liefert. Bei Eingabe = genau die Eingabe; bei leeren Feld + "OK" = ein leeres Feld und bei Abbruch = null. Wenn ich dich jetzt richtig verstanden habe ist hier null nicht gleich null, sondern ein Wert null, mit dem das Programm weiter arbeitet und deswegen auch diesen Wert an die nächste Methode übergibt (so hab ich es jetzt verstanden).

Wenn jetzt aber der Wert null korrekt ist, kann ich doch nie eine Ausnahme erzeugen, oder? Wo habe ich hier einen Denkfehler?!

Danke nochmals!
 

Ähnliche Java Themen

Neue Themen


Oben