Eigene Exceptions

Status
Nicht offen für weitere Antworten.

obi

Mitglied
Abend, ich hab bis jetzt hier im Forum nur die Post gelesen und hab jetzt auch "endlich" ne eigene Frage zur Java Programmieren ( Bin vor ner Weile von c# auf Java umgestiegen ).

Ich habe schon enige Sachen mit den allgemeinen Exceptions rumprobiert z.B.

Java:
public class Exceptionabfrage
{
	public static void main(String[] args)
	{
		// Nimmt eine Eingabe an und prüft ob es eine Zahl ist oder nicht, falls nicht wiederholt er die Eingabe
		
		int number = 0;
		
		//Endloss schleife welche erst durch Break unterbrochen wird falls es kein catch fall gab
		while(true)
		{
			
			try
			{
			
			// Erstellt ein GUI Eingabe fenster !	
			String s = javax.swing.JOptionPane.showInputDialog("Bitte Zahl eingeben" );
			number = Integer.parseInt(s);
			break;
			}
			
			//Exception das es keine Zahl war
			catch (NumberFormatException Oo)
			{
				System.err.println("Das war keine Zahl");
			}
			
						
		}
		
		System.out.println("Danke für die Zahl " + number);
		// Beendet das Programm
		System.exit(0);
		
		
	}
}

Doch jetzt wollt ich wissen wie eigene Exception genutzt werden können und vorallem für was ! Danach stellt mir die Frage wie ich meine eigene erstellte Exception sagen kann wann sie zutrifft.

Das man dafür eine neue Klasse erstellten muss die z.b von RunTimeException abgeleitet ist, ist mir klar, aber ich habe nirgents gefunden wie man dann der eigenen Exception sagen soll das sie dann und dann zutrifft. So ähnlich wie eine If Abfrage stelle ich mir das vor.

Damit wir ein kleines Beispiel haben sagen wir mal das wir einen Namen eingeben und meine Exception ausschlagen soll falls ein Sonderzeichen eingegeben worden ist ( oder was auch immer ). In meiner Vorstellung würde das ganze ca so aussehen:

Java:
public class EigeneException extends RunTimeException
{

EigeneException()
{
}

SonderzeichenException(String Eingabe)
{
// HIER REINSCHREIBEN WANN SIE ZUTREFFEN SOLL
}


}

und das Main stelle ich mir in diesem Fall so vor:

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

      String Name;
      
      try
     {
     Name = javax.swing.JOptionPane.showInputDialog("Bitte Namen eingeben ohne  Sonderzeichen !" )

     }
    
    catch (SonderzeichenException s)
    {
     System.err.println("Sie haben ein Sonderzeichen eingegeben");
    }





     }
}

Leider habe ich keine Ahnung ob es sich so umsetzen lässt oder ob überhaupt den eigentlich Sinn von den Exception trifft, klar würde es auch mit einer einfachen Methode bzw. Ifabfrage gehn ob da Sonderzeichen drinn sind aber mir fällt grad kein besseres Beispiel ein vielleicht habt ihr bessere beispiele für eigene Exceptions ?

Ich hoffe ihr versteht mein Problem 😉

mfg
 
dein Beispiel ist so gut wie jedes andere,
das besondere an Exceptions ist, dass man den aktuellen Arbeitsablauf verlassen und teilweise viele Methodenaufrufe zurückspringen kann,
je komplexer das Programm desto aufwendiger wäre es, das alles mit if nachzubilden,

kann man schlecht in Testprogrammen darstellen

werfen kannst du deine eigene Exception mit
if (sonderzeichen gefunden) {
throw new SonderzeichenException(evtl. Parameter passend zu einem Konstruktor);
}
 
und das Main stelle ich mir in diesem Fall so vor:

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

      String Name;
      
      try
     {
     Name = javax.swing.JOptionPane.showInputDialog("Bitte Namen eingeben ohne  Sonderzeichen !" )

     }
    
    catch (SonderzeichenException s)
    {
     System.err.println("Sie haben ein Sonderzeichen eingegeben");
    }





     }
}

Leider habe ich keine Ahnung ob es sich so umsetzen lässt oder ob überhaupt den eigentlich Sinn von den Exception trifft, klar würde es auch mit einer einfachen Methode bzw. Ifabfrage gehn ob da Sonderzeichen drinn sind aber mir fällt grad kein besseres Beispiel ein vielleicht habt ihr bessere beispiele für eigene Exceptions ?

Ich hoffe ihr versteht mein Problem 😉

mfg

Das funktioniert so nicht.
In dem try wird keine Funktion deine SonderzeichenException werfen.
Du müsstest eine eigene Methode bauen, die die Eingabe auf Sonderzeichen prüft und dann evtl. eine Exception wirft, mit der die main umgehen kann:

Java:
public String eingabe(){
 String eingabe = javax.swing.JOptionPane.showInputDialog("Bitte Namen eingeben ohne  Sonderzeichen !" );
if(eingabe.contains(sonderzeichen){
 throw new SonderzeichenException();
}
return eingabe

Jetzt kann deine main bei eingabe() die SonderzeichenException fangen.

Und ja, wie SlaterB schon angedeutet hat, Exceptions sind eine Möglichkeit dem Anwender einer Methode keine Rückgabe zu machen sondern eben eine Ausnahme zu symbolisieren. Was genau die Ausnahme war sagt das Exception-Objekt dann dem Aufrufer.
 
dein Beispiel ist so gut wie jedes andere,
das besondere an Exceptions ist, dass man den aktuellen Arbeitsablauf verlassen und teilweise viele Methodenaufrufe zurückspringen kann,
je komplexer das Programm desto aufwendiger wäre es, das alles mit if nachzubilden,

kann man schlecht in Testprogrammen darstellen

werfen kannst du deine eigene Exception mit
if (sonderzeichen gefunden) {
throw new SonderzeichenException(evtl. Parameter passend zu einem Konstruktor);
}

Denn Sinn habe ich verstanden, wer will schon alle paar Zeilen ein If sehen 😉

Aber genau da seh ich das Problem, vielleicht denke ich grad mit der Falschen logik nach.

Ich stelle mir das ganze so vor das beim Laufen des Programms bei jeder Zeile geschaut wird ob dort ein Fehler aufgetreten ist, falls ja wird der Fehler "geworfen" und mit catch eingefangen und die catches schaun von oben nach unten nach ob ihre Exception zu diesem Fehler passt. Falls er passt führt er das aus was ich in den Catch schreibe, z.b die error Meldung.

Also heißt dass das bei den Java Exceptions doch iwo deklariert sein muss wann sie zutreffen ! Und wenn ich jetzt logisch weiter denke müsste dies doch auch für meine eigene Exception gelten oder nicht ? Daher sollte dies doch bei der klassen Deklaration passieren. So das ich nicht wie du geschrieben hast eine extra if anweisung schreiben muss wann meine Exception genutzt werden soll.

Denn dann brauch ich doch die Exception gar nicht mehr, denn wenn durch das if sehe das es ein Sonderzeichen ist kann ich doch gleich in dem if den fehler beheben und brauch dafür die exception nicht.

Bitte klär mich auf falls ich mir das falsch Denke, ich seh auch grad iwie nicht wohin ich diese if anweisung von dir in dem Beispiel einbauen sollte, im try, in der klasse ?


ok ich seh grad das mir noch jmd geantwortet hat muss mir kurz den anderen post noch durchlesen


edit:

Hm, aber ich seh immer noch das gleiche Problem: Wenn du in der Methode eine If Anweisung machst wozu brauch ich dann noch meine Exception ? Dann kann ich genau so gut eine Methode erstellen welche jede Eingabe prüft ob sie Sonderzeichen enthält ( durch contains ) und falls ja soll er ne err meldung machen.

Falls ich für jedesmal eine if Anweisung brauche das er meine Exception wirft damit sie per catch gefangen werden kann, kann ich doch gleich diese if anweisung nutzen um den Fehler zu beheben.
 
Zuletzt bearbeitet:
> kann ich doch gleich diese if anweisung nutzen um den Fehler zu beheben.

exakt, deshalb besteht ein Programm zu 97% auf normalen if und nur zu 3% aus Exceptions,
eben weil man das meiste sofort klären kann,
Exceptions sind dann gut, wenn man es nicht sofort klären kann, beispielsweise wenn du eine allgemeine Bibliothek schreibst,
die in 10 verschiedenen Programmen benutzt wird, da kann die parse-Methode nicht wissen, was im Fehlerfall passieren soll,
das muss der Aufrufer machen

das try/ catch zur Exception gehört daher niemals in die gleiche Methode,
sondern ist irgendwo weit entfernt beim Aufrufer der Method oder so
 
Hm, aber ich seh immer noch das gleiche Problem: Wenn du in der Methode eine If Anweisung machst wozu brauch ich dann noch meine Exception ? Dann kann ich genau so gut eine Methode erstellen welche jede Eingabe prüft ob sie Sonderzeichen enthält ( durch contains ) und falls ja soll er ne err meldung machen.

Falls ich für jedesmal eine if Anweisung brauche das er meine Exception wirft damit sie per catch gefangen werden kann, kann ich doch gleich diese if anweisung nutzen um den Fehler zu beheben.

Der Sinn ist, dass du in der eingabe selbst NICHT auf den Fehler eingehen musst.
Wenn du ein System.out.println("Keine Sonderzeichen"); einbaust, dann wird immer auf der Konsole geschrieben.
Vielleicht will aber ein Anwender das ganze lieber in einem eigenen Fenster haben statt in der Konsole. Oder solange der Nutzer Sonderzeichen eingibt wieder neu abfragen.
Wenn du da eine Ausgabe einbaust kann der Aufrufer nichtmehr angemessen reagieren.

Normal sollte die Logik nichts ausgeben.
In dem Fall ist die Funktion eingabe() die Logik. Hier also nichts ausgeben.
Jetzt kannst du ja denken "hey, ich geb eh nen String zurück, also schreib ich hin: return "Fehler";". Damit weiss der Aufrufer aber nicht dass ein Sonderzeichen aufgetreten ist (sondern denkt sich eben "hmm, der Nutzer hat "Fehler" eingegeben)".
Andere Möglichkeit ist eben die Exception, womit der Aufrufer dann sagen kann: "Hey, ich hab keinen String bekommen sondern eine Exception, da muss ich reagieren".
In deinem Beispiel wäre es mit dem if auch so getan, aber bei größeren Projekten wirst du irgendwann nichtmehr wissen wie du angemessen reagierst.
 
Ok dann hatte ich am Ende doch eine Flasche vorstellung von der nützlichkeit von Exceptions, hatte gehofft die ganzen If´s mit einer Exception ersetzen zu können, also spielen eigene erstellste Excetions für den Anfang ( an dem ich noch bin ) eher eine kleine Rolle ?

@Vorposter, auch dir Danke ich. Ich denke ich muss wohl erstmal zu so einem Fall kommen den du angesprochen hast wo ich eigene Exceptoins wirklich brauche.

Aus meiner Sicht jetzt nimmt es sich halt nichts zwischen einer eigenen Methode, ner If Anweisung oder Exception ( die in einer Methode dann ist ), nur das manche übersichtlicher sind als die anderen.
 
Zuletzt bearbeitet:
So ich habs mal Probiert zwar nicht ganz so wie ich es mir am Anfang gewünscht habe aber es funktioniert.

Java:
import java.io.*;
import java.sql.Date;
import java.util.Arrays;
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.*;

//Klasse für die eigene Exception welche von RuntimeException erbt
class ownexception extends RuntimeException
{
	public ownexception()
	{
		
	}
	
	public ownexception(String s)
	{
		super(s);
	}
	
	//Methode welche schaut ob es ein ! drinne ist, falls ja wirfst sie meine Exception die dann erst vom Catch gefangen werden kann
	public void Zeichenprüfung(String eingabe)
	{
		if(eingabe.contains("!"))
			throw new ownexception();
	}
		
}


public class fürleon 
{
	public static void main(String[] args)
	{
				
		int number = 0;
		ownexception d = new ownexception();		
		
		while(true)
		{
			
			try
			{
			String s = javax.swing.JOptionPane.showInputDialog("Bitte Zahl eingeben" );
		
			//Andere möglichkeit falls man keine Methode nutzen will
			if(s.contains("?"))
				throw new ownexception();
			
			d.Zeichenprüfung(s); // Die Methode
			number = Integer.parseInt(s);
						
			break;
			}
						
			catch(NullPointerException a)
			{
				System.exit(0);
			}
			catch(NumberFormatException ee)
			{
				System.out.println("Das war keine Zahl");
			}
			//Fängt hier meine Exception falls sie geworfen wurde
			catch (ownexception o)
			{
				System.err.println("Da war ein ! oder ? drinne");
			}
			
		}
		
		System.out.println("Danke für die Zahl " + number);
		System.exit(0);
				
	}

	

		
	
}

Ich habe nur eine Frage noch die ich einfach nicht verstehe ! Wenn ich meine Methode d.Zeichenprüfung(s); NACH DEM number = Integer.parseInt(s); einsetze funktioniert die Exception nicht: catch(NullPointerException a) welche ja Ausgelöst werden soll falls bei der Eingabe jmd auf "Abbrechen" klickt. Könnt mir einer sagen warum ?
 
weil Integer.parseInt vorher eine NumberFormatException wirft?

'funktioniert nicht' existiert in keinem Wortschatz,
du kannst doch genau feststellen, was stattdessen passiert
 
Kopf -> Tisch.

Naja ich habs jetzt kapiert wie man die eigene Exceptions einbinden kann, daher kanns Geschlossen werden.
 
Da gibt es so einen hübschen Knopf, mit dem du das Thema als "erledigt" kennzeichnen kannst ...
 
Hab den Knopf gesucht und erst jetzt gefunden 😉
Nicht gedacht dass das Klicken "Frage offen" den Status auf Erledigt ändert.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben