2012-06-20 9 views

Antwort

7
Griff

Ist es jedoch möglich, beide Ausnahmen zu behandeln, wenn die Methode nur die allgemeinste ie IOException auslöst?

Absolut. Sie können nach wie vor fangen sie getrennt:

try { 
    methodThrowingIOException(); 
} catch (FileNotFoundException e) { 
    doSomething(); 
} catch (IOException e) { 
    doSomethingElse(); 
} 

So macht es keinen Unterschied zu dem, was der Anrufer kann tun, wenn die Methode beide erklärt - es ist überflüssig. Es kann jedoch betonen Ausnahmen, die Sie möglicherweise berücksichtigen möchten. Dies könnte in Javadoc besser als nur die throws-Deklaration gemacht werden.

0

Ist es jedoch möglich, beide Ausnahmen zu behandeln, wenn die Methode nur die allgemeinste ie> IOException auslöst?

catch(IOException ex){ 
if(ex instanceof FileNotFoundException){} 
} 

Aber das ist nicht sauber sieht, sieht sowohl Ausnahme Werfen gut, würde auch Anrufer kommen, um zu wissen, dass diese Methode, um diese diese Ausnahmen auslösen können, so werden sie es richtig

+0

Du hast Recht es nicht sauber ist - aber es ist nicht notwendig, auch nicht. Siehe meine Antwort und Karthiks. Im Grunde braucht man diese Hässlichkeit nicht. –

+0

@Jon, wenn wir die Methode deklarieren, um IOException zu werfen, wie würde Anrufer wissen, dass es auch FileNotFoundException auslösen kann? –

+0

Es ist nicht "auch" - eine FileNotFoundException * ist * eine IOException, so dass Sie immer versuchen können, sie abzufangen, wenn die Methode deklariert, dass sie IOException auslöst. Es wäre Sache der Dokumentation zu spezifizieren, unter welchen Umständen dies geschieht. –

0

Ja, es ist möglich, beides zu behandeln, wenn die Methode nur IOException auslöst.

Der beste Weg, um eine solche Frage zu beantworten, ist einen Test zu schreiben, um es zu demonstrieren und auszuprobieren. Lassen Sie die JVM Ihnen die Antwort sagen. Es wird schneller sein als hier zu fragen.

+0

Eigentlich waren die Antworten ziemlich schnell und schneller als ich eine Testklasse schreiben musste. Meine Frage hatte auch einen anderen Teil und ich hoffe, dass es auch für andere nützlich sein könnte. –

0

ja. wenn bestimmte spezialisierte Ausnahmen korrekt behandelt werden können. Es ist, wenn Sie die Ausnahmen wie folgt behandeln:

try { 
} catch (FileNotFoundException f) { 
//Try a different file 
} catch (IOException ioe) { 
//Fatal, Maybe bad blocks ... Bail out... 
} catch (Exception e) { 
//Something went wrong, see what it is... 
} 
3

Ist es sinnvoll, eine Methode zu erklären, eine Ausnahme und eine Unterklasse dieser Ausnahme zu werfen, z.B. IOException und FileNotFoundException?

Normalerweise nicht - die meisten IDEs, die ich kenne, geben sogar Warnungen für solche Deklarationen aus. Was Sie tun können und sollten, ist, die verschiedenen in Javadoc geworfenen Ausnahmen zu dokumentieren.

Ist es jedoch möglich, beide Ausnahmen zu behandeln, wenn die Methode nur die allgemeinste ie IOException auslöst?

Ja ist es, Sie müssen nur sicherstellen, dass die Catch-Blöcke in der richtigen Reihenfolge sind, d. H. Spezifischer zuerst.Catch-Blöcke werden in der Reihenfolge, wie sie definiert sind, ausgewertet, so dass hier

try { 
    ... 
} catch (FileNotFoundException e) { 
    ... 
} catch (IOException e) { 
    ... 
} 

, wenn die ausgelöste Ausnahme ein FileNotFoundException ist, wird es durch den ersten catch Block abgefangen werden, sonst wird es in den zweiten fallen und behandelt wie ein allgemein IOException. Die entgegengesetzte Reihenfolge würde nicht funktionieren, da catch (IOException e) alle IOException s einschließlich FileNotFoundException fangen würde. (. In der Tat, in einem Übersetzungsfehler IIRC letztere führen würde)

0

Deklarieren, dass das Verfahren (mehr generic) werfen kann IOException und (mehr spezifische) FileNotFoundException ist in der Regel eine gute Sache - es ist ein zusätzliche Informationen für Personen, die Ihren Code später verwenden. Beachten Sie, dass Sie explizit im JavaDoc angeben sollten, unter welchen Umständen jede der Ausnahmen ausgelöst wird.

Sie werden noch in der Lage sein, die Ausnahmen zu unterscheiden, und behandeln sie anders fangen Konstrukte wie diese verwenden:

try { 
    yourAwesomeMethod() 
} catch (FileNotFoundException ex) { 
    // handle file-not-found error 
} catch (IOException ex) { 
    // handle other IO errors 
} 
Verwandte Themen