Java throws exception. Genauer Nutzen?

king0r

Lt. Junior Grade
Registriert
Juli 2009
Beiträge
485
Hallo,

ich bin gerade beim Thema Exception handling in Java.
Ich habe mir grad die Frage gestellt, welchen Unterschied es eigentlich macht, ob ich einer Methode mittels throws Exception den Namen der gewünschten Exception mitgebe oder die Fehlerausgabe gleich im try / catch Block via catch (Exception e) handle?

Da ist mir leider der Unterschied noch nicht wirklich klar. Macht man den throws Zusatz zwecks besserer Lesbarkeit für Dritte oder hat das noch einen anderen Sinn? Weil besser finde ich es via catch .... alle möglichen Fehler abzuhandeln, die so vorkommen können.
 
Du musst entscheiden ob du direkt in der Methode die Exception behandelst, oder falls die Methode irgendwo anders aufgerufen wird, kannst du dort die Exception behandeln. Die Exceptionbehandlung ausserhalb der Klasse macht Sinn, wenn man in dem catch Objekte oder Methoden aufruft, die die Klasse/Methode, die die Exception wirft, nicht einsehen kann.
 
kommt auf den kontext an!
schreibst du klassen für andere ist es meistens sinnvoller dem "nutzer"/anderen programmierer die folge daraus zu überlassen.
 
es macht im normalfall einfach keinen sinn die exception zu fangen, zum grossteil solltest du eigentlich nur try/finally blöcke nutzen. was willst du denn auf der datenzugriffschicht machen, wenn der zugriff fehltschlägt oder die netzwerkverbindung weg ist?

erst in den oberen (z.b. gui) schichten kann man den fehler loggen und ggfs. den benutzer fragen, was er jetzt vor hat.
 
Danke für die Antworten. Aber leider ist mir der Sinn von throws immer noch net ganz klar.
Ich habe in einer Klasse nun mehrere Methoden erstellt. Methode1 hat bei mir jetzt die Endung throws WrongInput. In einer anderen Methode2 rufe ich nun Methode1 auf und muss aufgrund des throws Zusatzes von Methode1 nun nochmal ne catch Behandlung machen.
Lasse ich throws bei Methode1 weg, so entfällt der catch Block in Methode2.

Dient mir dieser throws Zusatz also eher dazu, für jede Methode (egal ob selbe Klasse oder nicht) eine eigenständige Fehlerbehandlung zu machen??
 
Code:
public class Test {
 public static void main(String[] args) {
  Hurr test = new Hurr();
  Durr test1 = new Durr("bla");
  try {
    test.setTest("123.30");
  } catch (NumberFormatException nfe) {
    System.out.println(test1.getHurr());
  }
 }
}
Code:
public class Durr {
 private String hurr = "durr";
 public Durr(String in) {
  hurr = in;
 }
 public String getHurr() { return hurr; }
}
Code:
public class Hurr {
 private int test = 0;
 public void setTest(String in) throws NumberFormatException {
  test = Integer.parseInt(in);
 }
}

Wie willst du den String, den das Objekt test1 der Klasse Durr in "hurr" drinstehen hat, aus der Klasse Hurr lesen, ohne dass du Zugriff auf die Klasse Durr/Objekt test1 hast?
Bloedes Beispiel, keine Ahnung ob der Code so geht (habs hier runtergeschrieben, nich getestet), aber verdeutlicht das Problem. Wenn du try/catch in der methode setTest direkt implementierst, kannst du nicht auf die Fehlermeldung oder was auch immer von der Klasse Durr/Objekt test1 zugreifen.
 
Zuletzt bearbeitet:
Also ich finde das Beispiel von darkarchon nicht gerade einleuchtend...ich versuche es dann auch mal.

Netzwerke sind, wie ich finde, immer ein schönes Beispiel. Ich habe eine GUI, die sich an einen Server anmelden soll (genaueres ist irrelevant):

Code:
Connection connection = new Connection();
connection.connect( "server.domain.tld" );

connection.getDaten( .... );

Der Code könnte natürlich funktionieren, aber wie soll der Anwendungsprogrammierer hier Fehler darstellen?

Beispiel, bei dem die Methode connect eine Exception wirft (getDaten sollte natürlich auch bei einem Fehler, z.B. Netzwerkproblem, eine entsprechende Exception werfen):

Code:
Connection connection = new Connection();

try {

  connection.connect( "server.domain.tld", username, passwort );

  connection.getDaten( .... );

}
catch( AuthenticationException authEx ) {

  //Folgende Meldung in einem GUI-Fenster (JDialog) anzeigen:
  JOptionPane.....( "Benutzername und/oder Kennwort falsch....." );

}
catch( IOException ex ) { 

  // Bei einem Netzwerkproblem wird eine IOException geworfen (Beispiel):
  JOptionPane....( "Es konnte keine Verbindung zum Server hergestellt werden..bla bla bla" );

}

Ich hoffe es ist so etwas deutlicher geworder, wofür es wichtig ist Exceptions "nach oben weiter zureichen"...
 
Zuletzt bearbeitet:
Danke für die Antworten. Aber leider ist mir der Sinn von throws immer noch net ganz klar.
Ich habe in einer Klasse nun mehrere Methoden erstellt. Methode1 hat bei mir jetzt die Endung throws WrongInput. In einer anderen Methode2 rufe ich nun Methode1 auf und muss aufgrund des throws Zusatzes von Methode1 nun nochmal ne catch Behandlung machen.
Lasse ich throws bei Methode1 weg, so entfällt der catch Block in Methode2.

Hab dich jetzt mal so verstanden:

Code:
public void Methode1() throws WrongInput
{
   try
   {
      if(Falsche Eingabe?)
      {
          throw(new WrongInput());
      }
   }
   catch(Exception e)
   {
      throw(e);
   }
}

public void Methode2()
{
    try
    {
        Methode1();
    }
    catch(Exception e)
    {
    }
}

wenn dies der Fall ist, solltest dir den try..catch Block in Methode1 sparen können...

Dient mir dieser throws Zusatz also eher dazu, für jede Methode (egal ob selbe Klasse oder nicht) eine eigenständige Fehlerbehandlung zu machen??
Über den throws Zusatz weiss der Compiler welche Exceptions von einer Methode geworfen/ausgelöst werden können und kann somit auf deren nicht behandeln hinweisen...? d.h. wenn ich eine Methode benutzte welche den throws Zusatz beinhaltet habe ich 2 Möglichkeiten, entweder ich behandel die Exception(s) über try..catch oder ich lasse diese "weiterwerfen"/"durch" über den throws Zusatz.

/edit:
Um dir dies klarer zu machen schau dir einfach mal dieses Beispiel an:

Code:
public void Methode1() throws Exception // throws Exception gibt an das diese Methode eine Exception vom Typ Exception werfen könnte
{
  throw(new Exception()); // wirft die Exception
}

public void Methode2()
{
  try
  {
     Methode1();
  }
  catch(Exception e)
  {
    // Behandlung aller Exceptions vom Typ Exception
  }
}

public void Methode3() throws Exception // Exception wird nicht behandelt sondern in der Aufrufliste "durchgereicht"
{
  Methode1();
}
 
Zuletzt bearbeitet:
es ist in java einfach so, dass alle nicht-runtime exceptions "behandelt" werden müssen, das ganze heißt checked exceptions.

behandeln heißt in dem fall: der ersteller oder benutzer einer methode muss sich gedanken machen, ob die exception behandelt wird oder ob sie (weiter)geworfen wird. also entweder try/catch oder throws.
so kann man sich immer sicher sein, dass man zumindest bescheid weiß, welche exceptions (nicht runtime wie NPE) passieren können und ist nicht wie in c# (unchecked exceptions) auf die doku angewiesen und überrascht wenns kracht.

Was ist besser? ansichtssache.. checked exceptions geben probleme beim erweitern von apis, da die exceptions zur methodendeklaration gehören, dh von interfaces vorgegeben werden. Bestehende interfaces können also nicht so einfach um neue exceptions erweitert werden, außer man packt sie in erlaubte exceptions oder wirft sie als oder in runtimeexceptions..
alles nicht so einfach ;)

merken: try/catch wenn man das problem beheben kann, ansonsten so lange weiterwerfen bis man zumindest ne info an den user geben kann.
 
Zurück
Oben