Eigene Ausnahmebehandlung

thor_norsk

Bekanntes Mitglied
Guten Abend,
Wenn ich die Aufgabe richtig verstanden habe, soll ich die Aufgabe mit einer eigener try / catch - Anweisung umprogrammieren ?

Aufgabe) In unserer Klasse für die grafischen Eingabedialog überprüfen wir durch den Vergleich einer Variablen mit dem wert null, ob die Eingabe abgebrochen wurde. Dieses Konstruktion kann grundsätzlich auch durch eine Ausnahmebehandlung ersetzt werden. Welche Ausnahme käme dafür infrage? Wie könnten Sie diese Ausnahme auslösen?
Ein kleiner Tipp: Sehen Sie sich genau an, welchen Wert der Eingabedialog liefert, wie die Eingabe abgebrochen wird. benutzen Sie dazu gegebenenfalls auch den Debugger von Eclipse.

[CODE lang="java" title="Ausnahmebehandlung"]public class EingabeDialog {
//die Hilfsmethode zum Einlesen der Daten über den Dialog
//Beschreibung siehe oben
private static String lesen(String text) throws AbbruchException {
String eingabeTemp;
eingabeTemp = JOptionPane.showInputDialog("Bitte geben Sie einen " + text + " Wert ein:");
//Wenn die Eingabe abgebrochen wurde, wird eine selbst definierte Ausnahme ausgelöst
if (eingabeTemp == null)
throw new AbbruchException("Die Eingabe für " + text + " wurde abgebrochen");

return (eingabeTemp);
}[/CODE]

Mein Vorschlag:

[CODE lang="java" title="Einlsen"]package eingabedialog;
import javax.swing.JOptionPane;

public class Eingabe {

private static String lesen(String text) {

String eingabeTemp;
eingabeTemp = JOptionPane.showInputDialog("Bitte geben Sie einen " + text + " Wert ein:");
boolean gelungen = false;

while ( gelungen == false ) {
eingabeTemp = lesen (text);
try {
if (eingabeTemp != null)
gelungen = true;
}

catch (NumberFormatException e) {

JOptionPane.showMessageDialog(null,"Ihre Eingabe war nicht gültig. Bitte wiederholen...");
}
}

return (eingabeTemp);
}
}[/CODE]

und die Testklasse:

[CODE lang="java" title="main - Klasse"]package eingabedialog;
import eingabedialog.Eingabe;
import javax.swing.JOptionPane;

public class EingabeTest {

public static void main(String[] args) {

String wert;

// Aufruf der Methode einlesen() mit einem int-Typ!

try {
wert = Eingabe.lesen(wert);
JOptionPane.showMessageDialog(null," Ihre Eingabe war"+wert);
}

// Behandlung der eigenen Exception

catch (NumberFormatException e) {

JOptionPane.showMessageDialog(null, e.getMessage());
}
}
}[/CODE]

In der main() - Klasse Zeile 14 macht Eclipse folgender Fehlermeldung: Die Methode lesen(String) aus dem Typ Eingabe ist nicht sichtbar (visible)

Danke!
 
G

Gelöschtes Mitglied 65838

Gast
Java:
private static String lesen
ist sie auch ...


es kommt eine eingabe rein => wenn null dann exception

und du wirfst eine numberformat exception ... was hat die jetzt mit dem null zu tun?
gar nix...


sehr wahrscheinlich wirds dafür ne exception geben *hust*nullpointerexception*hust*

wie kannst du sie auflösen? naja der input ist ja ein string ... was hat ein string mehr als der wert null ... richtig die toString() methode da string von objekt extended und "null" nicht

also

Java:
wert= Eingabe.lesen();
wert.toString(); // wird eine nullpointer exception werfen falls null ... null hat keine toString() methode
jetzt hast immer noch dein private problem

dann mach nen umweg also wird dann

Java:
wert = Eingabe.umweg();

...
    ...
    ....
  
    public String umweg(){
     return Eingabe.lesen();
}

was JETZT noch sein könnte ist

du solltest nicht das lesen umschreiben sondern die Exception die beim lesen geworfen wird behandeln

dann hast du einfach einen try catch block mit der "AbbruchException e" drin keine ahnung wies genau gemeint ist..mMn macht aber das erste mit dem null mehr sinn...
 

thor_norsk

Bekanntes Mitglied
Wäre laut Aufgabenstellung falsch, wenn ich Alles in der main - Klasse behandle? Also Eingabe in main , Ausnahme-Prüfung in main() und Ausgabe , Alles in main() ???? Wäre für mich einfacher als Anfänger
 
G

Gelöschtes Mitglied 65838

Gast
du hast in der Lesen methode eine Ausnahme wenn ==null... dann wird die eigene Exception geworfen
Java:
 Dieses Konstruktion kann grundsätzlich auch durch eine Ausnahmebehandlung ersetzt werden. Welche Ausnahme käme dafür infrage? Wie könnten Sie diese Ausnahme auslösen?
wie kannst du diese ersetzen? ... also in der Lesen methode diese solltest du umschreiben somit keine Exception mehr geworfen wird

dh
Java:
try{
    String wert = ....
    wert.toString() // falls null wird eine Exception kommen => um genau zu sein nullpointer
}catch ( NullPointerException e){
    throw new AbbruchException();
}
das wäre was ich abgeben würde...das if (... == null) soll durch ein try catch ersetzt werden

was hiermit getan wurde
 

thor_norsk

Bekanntes Mitglied
[CODE lang="java" title="JAVA"]private static String lesen(String text) {

String wert;

try{
wert = JOptionPane.showInputDialog("Bitte geben Sie einen Wert ein");
wert.toString();
}
catch (NullPointerException e){
throw new AbbruchException();
}
} [/CODE]

Wäre so richtig? Oder habe ich falsch verstanden?
 
G

Gelöschtes Mitglied 65838

Gast
ja du hast einen fehler und den zeigt dir eclipse
Java:
throw new AbbruchException();
wurde als eine Exception und nicht als eine Runtime Exception deklariert

aber du wirfst sie dh => entweder catchen oder throwen ( hier gehts um die AbbruchException die nullpointer hast du ja gefangen )

in der Original methode wird sie gethrowed dh du musst sie auch noch throwen im methoden header
vergleich ma
Java:
private static String lesen(String text) throws AbbruchException {
... eine RuntimeException musst du nicht throwen aber eine RuntimeException macht hier auch keinen sinn

warum?
falls falscher wert => reagiere ( theoretisch )

bei einer runtime exception
falls falscher wert => möglichkeit zmu reagieren muss aber net sein


bei einer falschen eingabe sollte man aber im programm meistens reagieren ... ist nur aus logischer sicht beurteilt
 

thor_norsk

Bekanntes Mitglied
[CODE lang="java" title="AbbruchException"]package aufgabex;

public class AbbruchException extends Exception {
/**
* automatisch über Eclipse ergänzt
*/
private static final long serialVersionUID = 1790155766626408529L;

//der Standard-Konstruktor
AbbruchException() {
super();
}

AbbruchException(String meldung) {
super(meldung);
}
}[/CODE]

Und verbessert.

[CODE lang="java" title="WerteEinlesen"]package aufgabex;
import javax.swing.JOptionPane;

public class WerteEinlesen {

private static String lesen (String text) throws AbbruchException {

String wert;

try{
wert = JOptionPane.showInputDialog("Bitte geben Sie einen Wert ein");
wert.toString();
}
catch (NullPointerException e){
throw new AbbruchException();
}
return (wert);
}
}
[/CODE]
 
G

Gelöschtes Mitglied 65838

Gast
was nicht "schick ist" ist dass das return am ende ist :)

wie wäre es denn mit
Java:
        private static String lesen (String text) throws AbbruchException {
    
    
        
        try{
                return JOptionPane.showInputDialog("Bitte geben Sie einen Wert ein").toString();
            }
            catch (NullPointerException e){
                throw new AbbruchException();
            }
    }

die formatierung is jetzt komplett am arsch :D

...trotzdem wäre die if == null abfrage schöner gewesen... aber joa... blöde aufgabe wie meistens

weil jedes mal wenn du jetzt die lesen methode aufrufst musst du so einen selten dämlichen try catch block schreiben... anstatt dass die fehler behandlung in der methode bleibt aber joaaa... ka warum

außerdem ist ein try catch ressourcen aufwändiger um ein minimales minimü ... aber das sei mal dahingestellt
 
Zuletzt bearbeitet von einem Moderator:
G

Gelöschtes Mitglied 65838

Gast
ja sieht nur blöd aus und verwirrt


meins sagt aus
Java:
return das ergebnis
oder
throw exception
deins sagt
Java:
setz wert
oder
throw exception
falls keine Exception
return wert
ist 1 mal ums eck gedacht... in einem code review könnte man es "annörgeln"

ob mans mit einer zwischen variable trotzdem macht ist davon nicht betroffen... kannst du nach lust und laune noch den String wert einbauen oder nich... kommt drauf an in welcher stimmung man ist :D
 
G

Gelöschtes Mitglied 65838

Gast
Java:
        private static String lesen (String text) throws AbbruchException {
    
    
        
        try{
                String wert = JOptionPane.showInputDialog("Bitte geben Sie einen Wert ein");
                return wert.toString();
            }
            catch (NullPointerException e){
                throw new AbbruchException();
            }
    }
geht natürlich auch
 
Sitze bei der gleichen Aufgabe fest, habe schon stundenlang herum probiert, aber bei mir bleibt nach wie vor der Fehler in der Main, das die Methode "lesen" bei


Java:
public static void main(String[] args) {

        String wert;

        // Aufruf der Methode einlesen() mit einem int-Typ!

        try {
            wert = EingabeDialog.lesen(wert);
            JOptionPane.showMessageDialog(null, " Ihre Eingabe war" + wert);
        }

        // Behandlung der eigenen Exception

                catch (NullPointerException e) {

                    JOptionPane.showMessageDialog(null, e.getMessage());
                }
    }


nicht sichtbar wäre, auch nicht auf public, protected. Auch das Verstellen auf Int hat nichts gebracht. :confused:
 

KonradN

Super-Moderator
Mitarbeiter
Dann zeige doch auch die Klasse EingabeDialog.

Ansonsten kann man nur sagen:
a) Die Kommentare sind definitiv falsch:
a1) "Aufruf der Methode einlesen() mit einem int-Typ!" -> Du übergibst einen String.
a2) "Behandlung der eigenen Exception" -> Du hast keine Eigene Exception sondern du versuchst da ja eine NPE zu fangen.

b) Der Code kann nicht übersetzen. Das hat aber nichts mit EingabeDialog zu tun sondern mit der lokalen Variable wert. Eine lokale Variable muss vor der ersten (lesenden) Verwendung initialisiert werden. wert wurde aber nicht initialisiert. Du musst also aufpassen: Instanz und Klassenvariablen werden automatisch mit einem Null-Wert initialisiert (also 0, 0.0, false, null, ... je nach Typ) aber lokale Variablen eben nicht!
 

KonradN

Super-Moderator
Mitarbeiter
Wenn man den Code der vorherigen Posts betrachtet (Was schlecht ist, da Du ja nach eigener Aussage Änderungen vorgenommen hast:

a) Da wird ja von der Methode lesen eine AbbruchException geworfen und keine NPE - daher müsstest Du auch eine AbbruchException fangen.

b) Die Methode ist das als private static gekennzeichnet. Das muss natürlich `public static`sein, damit die Methode nutzbar ist. Und dann muss die Klasse auch bei der anderen Klasse sein, damit diese verfügbar ist. Daher wäre wichtig: Wo sind die jeweiligen Klassen?
 
Hi Konrad, besten Dank für deine Ratschläge und Hinweise! Bisher habe ich noch etwas herum probiert, nochmal einige Sachen überlesen und mit meinem Heft verglichen, ich sende dir mal hier, was ich bisher zusammenbekommen habe. Funktionieren tut lediglich nur die Einlesefunktion, ich weiss, dass mit der Wertezuweisung der lokalen Variable in "EingabeTest" ist unsinnig, da muss es einen anderen Weg geben. Beste Grüsse und vielen lieben Dank 🙏

Java:
package exception;

import javax.swing.JOptionPane;

public class EingabeDialog {
    public static String lesen(String text) throws AbbruchException {

        try {
            String wert = JOptionPane.showInputDialog("Bitte geben Sie einen Wert ein");
            wert.toString();
            return wert;

        } catch (NullPointerException e) {
            throw new AbbruchException();
        }
    }
}


Code:
package exception;

public class AbbruchException extends Exception {

    public static final long serialVersionUID = 1790155766626408529L;

    AbbruchException() {
        super();
    }

    AbbruchException(String meldung) {
        super(meldung);
    }
}


Code:
package exception;

import javax.swing.JOptionPane;
import exception.EingabeDialog;
import exception.AbbruchException;

public class EingabeTest {

    public static void main(String[] args) {
        
        String wert = "1";
        try {
            wert = EingabeDialog.lesen(wert);
            JOptionPane.showMessageDialog(null, "Ihre Eingabe war " + wert);
        }

        catch (AbbruchException e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
            System.out.println("Es ist ein Fehler aufgetreten.");
        }
    }
}
 

Oneixee5

Top Contributor
Java:
Code:
package exception;

import javax.swing.JOptionPane;

public class EingabeDialog {
    public static String lesen(String text) throws AbbruchException {

        try {
            String wert = JOptionPane.showInputDialog("Bitte geben Sie einen Wert ein");
            wert.toString();
            return wert;

        } catch (NullPointerException e) {
            throw new AbbruchException();
        }
    }
}
Das ist etwas was man eigentlich nie tun würde. Du verwendest hier eine Exception um das Programm zu steuern.
Java:
package exception;

import javax.swing.JOptionPane;

public class EingabeDialog {
    
    public static String lesen(String text) throws AbbruchException {

        String wert = JOptionPane.showInputDialog("Bitte geben Sie einen Wert ein");
        if (wert != null) {
            return wert;
        }

        throw new AbbruchException();
    }
    
}
 

Neue Themen


Oben