class throwseg1
{
void show() throws Exception
{
throw new Exception("my.own.Exception");
}
void show2() throws Exception // Why throws is necessary here ?
{
show();
}
void show3() throws Exception // Why throws is necessary here ?
{
show2();
}
public static void main(String s[]) throws Exception // Why throws is necessary here ?
{
throwseg1 o1 = new throwseg1();
o1.show3();
}
}
Warum Compiler Berichte , dass Methoden show2()
, show3()
und main()
haben
nicht gemeldete Ausnahme Ausnahme, die abgefangen oder deklariert werden muss, um ausgelöst zu werden
Wann entferne ich throws Exception
von diesen Methoden?
Exception
, müssen wir die aufrufende Methode ( Methode2 ) mit definierenthrows Exception
; wenn wir diese Ausnahme nicht in der aufrufenden Methode übergeben. Der Zweck dieses Vorgangs besteht darin, der aufrufenden Methode ( Methode3 ) von Methode2 mitzuteilen, dass eine Ausnahme von Methode2 ausgelöst werden kann, und Sie sollten sie hier behandeln, da sie sonst Ihr Programm unterbrechen kann.throws Exception
in ihrer Methodendefinition definieren, um die aufrufende Methode aufzugeben. Erweiterung des vorherigen KommentarsAntworten:
Wie Sie vielleicht wissen, können Ausnahmen in Java in zwei Kategorien eingeteilt werden: Eine, die die
throws
Klausel benötigt oder behandelt werden muss, wenn Sie keine angeben, und eine andere, die dies nicht tut. Sehen Sie sich nun die folgende Abbildung an:In Java können Sie alles werfen, was die
Throwable
Klasse erweitert. Sie müssen jedoch nichtthrows
für alle Klassen eine Klausel angeben . Im einzelnen Klassen, die entweder einError
oderRuntimeException
oder irgendeine der Subklassen von diesen beiden. In Ihrem FallException
handelt es sich nicht um eine Unterklasse einesError
oderRuntimeException
. Es handelt sich also um eine aktivierte Ausnahme, die in derthrows
Klausel angegeben werden muss , wenn Sie diese bestimmte Ausnahme nicht behandeln. Deshalb brauchten Sie diethrows
Klausel.Aus dem Java-Tutorial :
Wie Sie wissen, werden Ausnahmen in zwei Kategorien eingeteilt: aktiviert und deaktiviert. Warum diese Klassifizierung?
Überprüfte Ausnahme: Sie werden verwendet, um Probleme darzustellen, die während der Ausführung des Programms behoben werden können. Sie sind normalerweise nicht die Schuld des Programmierers. Beispielsweise ist eine vom Benutzer angegebene Datei nicht lesbar oder es ist keine Netzwerkverbindung verfügbar usw. In all diesen Fällen muss unser Programm nicht beendet werden, sondern kann Aktionen wie das Benachrichtigen des Benutzers oder einen Fallback ausführen Mechanismus (wie Offline-Arbeiten, wenn das Netzwerk nicht verfügbar ist) usw.
Nicht aktivierte Ausnahmen: Sie können wiederum in zwei Bereiche unterteilt werden: Fehler und RuntimeExceptions. Ein Grund dafür, dass sie nicht aktiviert sind, besteht darin, dass sie zahlreich sind und für die Handhabung aller Programme unser Programm überladen und seine Klarheit verringern müssen. Der andere Grund ist:
Laufzeitausnahmen: Sie treten normalerweise aufgrund eines Fehlers des Programmierers auf. Wenn beispielsweise eine
ArithmeticException
Division durch Null auftritt oder eineArrayIndexOutOfBoundsException
auftritt, liegt dies daran, dass wir bei unserer Codierung nicht vorsichtig genug sind. Sie treten normalerweise aufgrund einiger Fehler in unserer Programmlogik auf. Sie müssen also gelöscht werden, bevor unser Programm in den Produktionsmodus wechselt. Sie sind in dem Sinne deaktiviert, dass unser Programm bei Auftreten fehlschlagen muss, damit wir Programmierer es zum Zeitpunkt der Entwicklung und des Testens selbst beheben können.Fehler: Fehler sind Situationen, aus denen das Programm normalerweise keine Wiederherstellung durchführen kann. Wenn beispielsweise a
StackOverflowError
auftritt, kann unser Programm nicht viel tun, z. B. den Funktionsaufrufstapel des Programms vergrößern. In diesem FallOutOfMemoryError
können wir nicht viel tun, um die für unser Programm verfügbare RAM-Größe zu erhöhen. In solchen Fällen ist es besser, das Programm zu beenden. Deshalb werden sie deaktiviert.Detaillierte Informationen finden Sie unter:
quelle
Java erfordert, dass Sie alle Ausnahmen behandeln oder deklarieren. Wenn Sie eine Ausnahme nicht mit einem try / catch-Block behandeln, muss sie in der Signatur der Methode deklariert werden.
Beispielsweise:
Sollte geschrieben werden als:
Auf diese Weise können Sie die Deklaration "throw Exception" in der Methodendeklaration entfernen.
quelle
RuntimeException
, das heißt.Throwable
(das ErbenException
funktioniert auch, da es erweitert wirdThrowable
, aber nicht erforderlich ist).Exception
ist eine geprüfte Ausnahmeklasse. Daher jeder Code, der eine Methode aufruft, die deklariert, dass sie damitthrows Exception
umgehen oder deklarieren muss.quelle
Die
throws Exception
Deklaration ist eine automatisierte Methode, um Methoden zu verfolgen, die aus erwarteten, aber unvermeidbaren Gründen eine Ausnahme auslösen können. Die Deklaration ist in der Regel spezifisch für den Typ oder die Arten von Ausnahmen, die ausgelöst werden können, wie z. B.throws IOException
oderthrows IOException, MyException
.Wir alle haben oder werden irgendwann Code schreiben, der unerwartet stoppt und eine Ausnahme aufgrund von etwas meldet, das wir vor dem Ausführen des Programms nicht erwartet hatten, wie z. B. Division durch Null oder Index außerhalb der Grenzen. Da die Fehler von der Methode nicht erwartet wurden, konnten sie nicht "abgefangen" und mit einer try catch-Klausel behandelt werden. Alle ahnungslosen Benutzer der Methode würden diese Möglichkeit ebenfalls nicht kennen und ihre Programme würden ebenfalls aufhören.
Wenn der Programmierer weiß, dass bestimmte Arten von Fehlern auftreten können, diese Ausnahmen jedoch außerhalb der Methode behandeln möchten, kann die Methode eine oder mehrere Arten von Ausnahmen für die aufrufende Methode "auslösen", anstatt sie zu behandeln. Wenn der Programmierer nicht deklariert hat, dass die Methode eine Ausnahme auslösen könnte (oder wenn Java nicht in der Lage wäre, sie zu deklarieren), könnte der Compiler dies nicht wissen und es wäre Sache des zukünftigen Benutzers der Methode, darüber Bescheid zu wissen. Fangen und behandeln Sie alle Ausnahmen, die die Methode möglicherweise auslöst. Da Programme viele Ebenen von Methoden haben können, die von vielen verschiedenen Programmen geschrieben wurden, wird es schwierig (unmöglich) zu verfolgen, welche Methoden Ausnahmen auslösen könnten.
Obwohl Java Ausnahmen deklarieren kann, können Sie dennoch eine neue Methode mit nicht behandelten und nicht deklarierten Ausnahmen schreiben. Java kompiliert sie und Sie können sie ausführen und auf das Beste hoffen. Java lässt Sie Ihre neue Methode nicht kompilieren, wenn es eine Methode verwendet, die als auslösende Ausnahme (n) deklariert wurde, es sei denn, Sie behandeln entweder die deklarierten Ausnahmen in Ihrer Methode oder deklarieren Ihre Methode als auslösende (n) Ausnahme (n) oder wenn es mehrere Ausnahmen gibt, können Sie einige behandeln und den Rest werfen.
Wenn ein Programmierer erklärt, dass die Methode einen bestimmten Ausnahmetyp auslöst, ist dies nur eine automatisierte Methode, um andere Programmierer mit der Methode zu warnen, dass eine Ausnahme möglich ist. Der Programmierer kann dann entscheiden, die Ausnahme zu behandeln oder die Warnung weiterzuleiten, indem er erklärt, dass die aufrufende Methode dieselbe Ausnahme auslöst. Da der Compiler gewarnt wurde, dass die Ausnahme bei dieser neuen Methode möglich ist, kann er automatisch prüfen, ob zukünftige Aufrufer der neuen Methode die Ausnahme behandeln oder deklarieren und das eine oder andere erzwingen.
Das Schöne an dieser Art von Lösung ist, dass der Compiler beim Melden
Error: Unhandled exception type java.io.IOException
die Datei- und Zeilennummer der Methode angibt , die zum Auslösen der Ausnahme deklariert wurde. Sie können dann einfach das Geld übergeben und deklarieren, dass Ihre Methode auch "IOException auslöst". Dies kann bis zur Hauptmethode erfolgen, bei der das Programm dann angehalten und die Ausnahme dem Benutzer gemeldet wird. Es ist jedoch besser, die Ausnahme abzufangen und auf nette Weise damit umzugehen, z. B. dem Benutzer zu erklären, was passiert ist und wie sie behoben werden kann. Wenn eine Methode die Ausnahme abfängt und behandelt, muss sie die Ausnahme nicht mehr deklarieren. Das Geld bleibt sozusagen dort stehen.quelle
Nur kleine Änderungen in Ihrem Programm. Was von vielen in Bezug auf das Hauptproblem missverstanden zu werden scheint, ist, wann immer Sie eine Ausnahme auslösen, die Sie behandeln müssen, nicht an derselben Stelle erforderlich (z. B. show1,2,3-Methode in Ihrem Programm), aber Sie müssen zuerst die Methode aufrufen innerhalb der 'Haupt'. Mit einem Wort, es gibt 'werfen', es muss 'fangen / versuchen' geben, auch wenn nicht dieselbe Methode, bei der eine Ausnahme auftritt.
quelle
Da in der show () -Methode eine Ausnahme geprüft ist, die in dieser Methode nicht behandelt wird, verwenden wir das Schlüsselwort throw, um die Ausnahme weiterzugeben.
Da Sie die show () -Methode in der show2 () -Methode verwenden und mindestens die Ausnahme propagiert haben, sollten Sie hier behandeln. Wenn Sie die Ausnahme hier nicht behandeln, verwenden Sie das Schlüsselwort throw. Dies ist der Grund für die Verwendung des Schlüsselworts throw bei der Methodensignatur.
quelle
Wenn Sie die Ausnahme weitergeben, indem Sie die Throws-Direktive in der Signatur der aktuellen Methode deklarieren, muss irgendwo in der Zeile oder im Aufrufstapel ein try / catch-Konstrukt verwendet werden, um die Ausnahme zu behandeln.
quelle
Wenn Sie die Ausnahme nicht an derselben Stelle behandeln, an der Sie sie auslösen, können Sie bei der Definition der Funktion grundsätzlich "Ausnahme auslösen" verwenden.
quelle