wake-up-neo.com

Warum ist beim Aufruf einer Funktion "wirft Ausnahme"?

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 meldet, dass die Methoden show2(), show3() und main() haben 

nicht gemeldete Ausnahme Ausnahme, die abgefangen oder zum Abwurf deklariert werden muss

wenn ich throws Exception von diesen Methoden entferne? 

70
nr5

Wie Sie vielleicht wissen, können in Java Ausnahmen in zwei Kategorien eingeteilt werden: Eine, die die throws-Klausel benötigt, oder muss behandelt werden, wenn Sie keine und eine andere angeben, die dies nicht tut. Nun sehen Sie die folgende Abbildung:

enter image description here

In Java können Sie alles werfen, was die Throwable-Klasse erweitert. Sie müssen jedoch keine throws-Klausel für alle Klassen angeben. Insbesondere Klassen, die entweder eine Error oder RuntimeException oder eine der Unterklassen dieser beiden sind. In Ihrem Fall ist Exception keine Unterklasse einer Error oder RuntimeException. Es handelt sich also um eine geprüfte Ausnahme und muss in der throws-Klausel angegeben werden, wenn Sie diese bestimmte Ausnahme nicht behandeln. Deshalb brauchten Sie die throws-Klausel.


Aus Java Tutorial :

Eine Ausnahme ist ein Ereignis, das während der Ausführung eines Programms auftritt und den normalen Ablauf der Programmanweisungen stört.

Nun, wie Sie wissen, werden Ausnahmen in zwei Kategorien eingeteilt: geprüft und nicht geprüft. Warum diese Klassifizierung?

Checked Exception: 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. Zum Beispiel ist eine vom Benutzer angegebene Datei nicht lesbar oder keine Netzwerkverbindung verfügbar usw. In all diesen Fällen muss unser Programm nicht beendet werden. Stattdessen kann es Aktionen ausführen, z. B. den Benutzer warnen oder einen Fallback ausführen Mechanismus (wie Offline-Betrieb, wenn das Netzwerk nicht verfügbar ist) usw.

Unchecked Exceptions: Sie können wiederum in zwei Teile unterteilt werden: Fehler und RuntimeExceptions. Ein Grund dafür, dass sie unkontrolliert sind, ist, dass sie zahlreich sind und es notwendig ist, alle zu handhaben, unser Programm durcheinanderbringen und die Übersichtlichkeit verringern. Der andere Grund ist:

  • Laufzeitausnahmen: Sie treten normalerweise aufgrund eines Fehlers des Programmierers auf. Wenn beispielsweise eine ArithmeticException der Division durch Null auftritt oder eine ArrayIndexOutOfBoundsException auftritt, liegt dies daran, dass wir bei der Codierung nicht vorsichtig genug sind. Sie passieren in der Regel einige Fehler in unserer Programmlogik. Sie müssen also gelöscht werden, bevor unser Programm in den Produktionsmodus wechselt. Sie sind unkontrolliert in dem Sinne, dass unser Programm bei seinem Auftreten versagen muss, damit wir Programmierer es zum Zeitpunkt der Entwicklung und des Testens selbst beheben können.

  • Errors: Fehler sind Situationen, aus denen das Programm normalerweise nicht wiederhergestellt werden kann. Wenn zum Beispiel eine StackOverflowError auftritt, kann unser Programm nicht viel tun, z. B. die Größe des Funktionsaufrufstapels des Programms erhöhen. Wenn eine OutOfMemoryError auftritt, können wir nicht viel tun, um die Menge an RAM zu erhöhen, die unserem Programm zur Verfügung steht. In solchen Fällen ist es besser, das Programm zu beenden. Deshalb werden sie unkontrolliert gemacht.

Für detaillierte Informationen siehe: 

121
Jomoos

Java erfordert, dass Sie alle Ausnahmen behandeln oder deklarieren. Wenn Sie eine Ausnahme nicht mit einem try/catch-Block behandeln, muss diese in der Signatur der Methode angegeben werden.

Zum Beispiel:

class throwseg1 {
    void show() throws Exception {
        throw new Exception();
    }
}

Sollte geschrieben werden als:

class throwseg1 {
    void show() {
        try {
            throw new Exception();
        } catch(Exception e) {
            // code to handle the exception
        }
    }
}

Auf diese Weise können Sie die Deklaration "wirft Ausnahme" in der Methodendeklaration los.

22
jebar8

Exception ist eine geprüfte Ausnahmeklasse. Daher muss jeder Code, der eine Methode aufruft, die erklärt, dass throws Exception sie behandelt, oder diese deklarieren.

3
Taymon

Die throws Exception-Deklaration ist eine automatisierte Methode zum Nachverfolgen von Methoden, die aus erwarteten, aber unvermeidlichen Gründen eine Ausnahme auslösen können. Die Deklaration ist in der Regel spezifisch hinsichtlich des Typs oder der Typen von Ausnahmen, die ausgelöst werden können, z. B. throws IOException oder throws IOException, MyException.

Wir alle haben oder werden schließlich Code schreiben, der unerwartet stoppt und eine Ausnahme meldet, weil wir vor dem Ausführen des Programms nichts erwartet hatten, wie Division durch Null oder Index außerhalb der Grenzen. Da die Fehler von der Methode nicht erwartet wurden, konnten sie nicht mit einer try-catch-Klausel "abgefangen" und behandelt werden. Jeder ahnungslose Benutzer der Methode würde diese Möglichkeit ebenfalls nicht kennen und auch ihre Programme würden 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 an die aufrufende Methode "werfen", 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 war, diese zu deklarieren), konnte der Compiler dies nicht wissen und der zukünftige Benutzer der Methode sollte wissen, fangen und behandeln alle Ausnahmen, die die Methode auslösen kann. Da Programme über viele Methodenebenen verfügen können, die von vielen verschiedenen Programmen geschrieben werden, ist es schwierig (unmöglich) zu verfolgen, welche Methoden Ausnahmen auslösen können. 

Obwohl Java die Möglichkeit hat, Ausnahmen zu deklarieren, können Sie immer noch eine neue Methode mit nicht behandelten und nicht deklarierten Ausnahmen schreiben. Java wird sie kompilieren und Sie können sie ausführen und auf das Beste hoffen. Java lässt Sie nicht zu, dass Sie Ihre neue Methode kompilieren, wenn sie eine Methode verwendet, die als auslösende Ausnahme (n) deklariert wurde, es sei denn, Sie behandeln entweder die deklarierte (n) Ausnahme (n) in Ihrer Methode oder deklarieren Ihre Methode als dieselbe 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 Möglichkeit, 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 weitergeben, indem er die aufrufende Methode als dieselbe Ausnahme deklariert. Da der Compiler gewarnt wurde, dass die Ausnahme in dieser neuen Methode möglich ist, kann er automatisch prüfen, ob zukünftige Aufrufer der neuen Methode die Ausnahme behandeln, oder sie deklarieren und den einen oder anderen erzwingen.

Das Schöne an dieser Art von Lösung ist, dass der Compiler, wenn er Error: Unhandled exception type Java.io.IOException meldet, die Datei und die Zeilennummer der Methode angibt, die zum Auslösen der Ausnahme deklariert wurde. Sie können dann den Buck einfach weitergeben und erklären, dass Ihre Methode auch "IOException" auslöst. Dies kann bis zur Hauptmethode durchgeführt werden, wo das Programm dann angehalten wird und die Ausnahme an den Benutzer gemeldet wird. Es ist jedoch besser, die Ausnahme zu erfassen und auf eine nette Art und Weise zu behandeln, z. B. dem Benutzer zu erklären, was passiert ist und wie diese behoben werden kann. Wenn eine Methode die Ausnahme abfängt und verarbeitet, muss sie die Ausnahme nicht mehr deklarieren. Der Dollar bleibt dort sozusagen stehen.

3
dansalmo
package javaexception;


public class JavaException {
   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[] args) {

   JavaException a = new JavaException();

   try{
   a.show3();
   }catch(Exception e){
       System.out.println(e.getMessage());
   }
}

Nur kleine Änderungen in Ihrem Programm. Was von vielen in Bezug auf das Hauptproblem missverstanden wird, ist, wenn Sie eine Ausnahme auslösen, die Sie behandeln müssen, nicht an derselben Stelle (z. B. show1,2,3-Methode in Ihrem Programm) in der "Haupt". In einem Wort gibt es 'throw', es muss 'catch/try' geben, auch wenn nicht dieselbe Methode gilt, bei der eine Ausnahme auftritt.

0
tawess

Wenn Sie die Ausnahme verbreiten, 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.

0
Beaumont Muni
void show() throws Exception
{
    throw new Exception("my.own.Exception");
}

Da in der show () -Methode die Ausnahme geprüft ist, die in dieser Methode nicht behandelt wird, verwenden wir das throws-Schlüsselwort, um die Exception zu verbreiten.

void show2() throws Exception //Why throws is necessary here ?
{
show();
}

Da Sie die Methode show () in der Methode show2 () verwenden und die Ausnahme mindestens propagiert haben, sollten Sie hier behandeln. Wenn Sie die Exception hier nicht behandeln, verwenden Sie das Throws-Schlüsselwort ..__ Dies ist der Grund für die Verwendung des Throws-Schlüsselworts bei der Methodensignatur.

0
Aditya