it-swarm.com.de

Was bedeutet es, wenn die Hauptmethode eine Ausnahme auslöst?

Ich überprüfe eine Zwischenbilanz, die ich morgen für meine Abschlussprüfung vorbereitet habe. Ich habe diese Frage falsch verstanden, aber es gibt keine richtige Antwort, und ich habe es versäumt, den Prof danach zu fragen.

Betrachten Sie den folgenden Codeausschnitt:

public static void main(String[] args) throws FileNotFoundException

Welche der folgenden Aussagen zu diesem Code ist richtig?

  1. Die Hauptmethode ist darauf ausgelegt, alle Arten von Ausnahmen zu erfassen und zu behandeln.
  2. Die Hauptmethode ist so konzipiert, dass FileNotFoundException abgefangen und behandelt wird.
  3. Die Hauptmethode sollte einfach beendet werden, wenn FileNotFoundException auftritt.
  4. Die Hauptmethode sollte einfach beendet werden, wenn eine Ausnahme auftritt.

Ich hatte die zweite Option gewählt.

28
agent154

Antwort ist Nummer 4, 

4.- Die Hauptmethode sollte einfach beendet werden, wenn eine Ausnahme auftritt.

Die throws-Klausel gibt nur an, dass die Methode eine geprüfte FileNotFoundException auslöst und die aufrufende Methode diese abfangen oder erneut auslösen soll. Wenn eine nicht geprüfte Ausnahme in der Hauptmethode ausgelöst wird (und nicht catch), wird sie ebenfalls beendet.

Überprüfen Sie diesen Test:

public class ExceptionThrownTest {

    @Test
    public void testingExceptions() {

        try {
            ExceptionThrownTest.main(new String[] {});
        } catch (Throwable e) {
            assertTrue(e instanceof RuntimeException);
        }

    }

    public static void main(String[] args) throws FileNotFoundException {

        dangerousMethod();

        // Won't be executed because RuntimeException thrown
        unreachableMethod();

    }

    private static void dangerousMethod() {
        throw new RuntimeException();
    }

    private static void unreachableMethod() {
        System.out.println("Won't execute");
    }
}

Wie Sie sehen, wird die Methode auch beendet, wenn ich eine Variable RuntimeException verwende, selbst wenn die geworfene Ausnahme keine FileNotFoundException ist.

17
ElderMael

Dude, ein bisschen spät, aber die Antwort ist Nummer 3.

Nummer 1 ist falsch, da FileNotFoundException nicht behandelt wird

Nummer 2 ist aus demselben Grund falsch.

Nummer 3 ist wahr. Wenn eine FileNotFoundException ausgelöst wird, wird die Hauptmethode beendet.

Nummer 4 ist falsch. Im Falle einer Ausnahme würde es nicht enden. Es würde nur bei ungeprüfter Ausnahme oder FileNotFoundException beendet. Wenn in der 'throws'-Klausel keine anderen geprüften Ausnahmen deklariert sind, bedeutet dies, dass sie innerhalb der Methode behandelt werden.

9
MartinV

Die Hauptmethode fängt keine Ausnahmen ab, sondern behandelt die Variable FileNotFoundException, indem sie an die Quelle geworfen wird, die die Hauptmethode aufgerufen hat.

Die Systemlaufzeit startet die JVM-Klassen. Eine bestimmte Klasse unter den JVM-Klassen ruft die Hauptmethode auf.

Die Handhabung der throws der Hauptmethode unterliegt in diesem Fall den JVM-Klassen.

  • Sie können dies in der von Oracle bereitgestellten Java-Sprachspezifikation nachlesen.
  • Darüber hinaus können Sie den Quellcode für einige der verfügbaren JVMs anzeigen. Wenn Sie diesen Pfad verwenden, gelangen Sie jedoch zu anderen Programmiersprachen OpenJdk .

Ich dachte daran, meine kleine erniedrigte Forschungskruste in diesem Thema zu teilen. Ich hoffe, es hilft Neugierigen :)

4
E_X

Ich stimme mit einigen anderen Antworten überein, dass Option 3 die richtige Antwort auf die Frage ist. Option 4 sagt: 

  1. Die Hauptmethode sollte einfach beendet werden, wenn eine Ausnahme auftritt.

Beachten Sie das "beliebige" in dieser Option. Hier ein Beispiel für Code, in dem eine Ausnahme auftritt, aber main() nicht beendet wird:

public static void main(String[] args) throws FileNotFoundException {
    try {
        methodThatThrowsACheckedException();
    } catch (SomeCheckedException e) {
        // do something to handle this exception
    }
}

In diesem Code tritt eine Ausnahme auf, die Methode wird jedoch nicht beendet, da sie so eingerichtet wurde, dass sie diese Ausnahme behandelt. Wenn die Ausnahme UncheckedException nicht erfasst wurde, wird die Methode natürlich beendet. Der Punkt von Option 4 besteht jedoch darin, dass jedes Gegenbeispiel es für ungültig erklärt, da es eine Ausnahme von "any" gibt.

Option 3 begrenzt diese Beendigung jedoch nur dann, wenn die Ausnahme in der Signatur der Methode ausgelöst wird:

  1. Die Hauptmethode sollte einfach beendet werden, wenn FileNotFoundException auftritt.

Der Grund von Option 3 ist sinnvoller, weil Code wie der folgende in der Praxis nicht sinnvoll ist:

public static void main(String[] args) throws FileNotFoundException {
    try {
        methodThatThrowsFileNotFoundException();
    } catch (FileNotFoundException e) {
        // do something to handle this exception
    }
}

Es macht nicht viel Sinn, zu erklären, dass eine Methode eine Ausnahme auslöst, aber diese Ausnahme in der Methode abfangen (es sei denn, Sie werfen sie erneut aus, nachdem Sie etwas getan haben. In diesem Fall gilt Option 3 weiterhin, da die Methode schließlich beendet wird ).

1
ryoung10

Nur mit der Deklaration von main() ist es unmöglich zu sagen, welche Antwort objektiv korrekt ist. Jede der Aussagen könnte wahr sein, abhängig von der Definition der Methode.

  1. Die Hauptmethode dient zum Abfangen und Behandeln aller Arten von Ausnahmen.

  2. Die Hauptmethode dient zum Auffangen und Behandeln von FileNotFoundException.

Beide obigen Aussagen treffen auf Folgendes zu:

public static void main(String[] args) throws FileNotFoundException {
    while (true) {
        try {
            doSomething();
        }
        catch (Exception e) {}
    }
}

Die deklarierte Ausnahme wird nie von main() ausgelöst, aber das ist kein Fehler. nur sinnlos und irreführend.

  1. Die Hauptmethode sollte einfach beendet werden, wenn FileNotFoundException auftritt.

  2. Die Hauptmethode sollte einfach beendet werden, wenn eine Ausnahme auftritt.

Beide obigen Aussagen treffen auf Folgendes zu:

public static void main(String[] args) throws FileNotFoundException {
    try {
        doSomething();
    }
    catch (Exception e) {
        return;
    }
} 

Natürlich können wir die Absicht der Frage anhand dessen erraten, was ein anständiger und vernünftiger Programmierer beabsichtigt, mit dieser Methodensignatur zu kommunizieren. Was wäre, dass sie beabsichtigen, dass die Methode FileNotFoundException wirft und notwendigerweise andere geprüfte Exceptions behandelt. Wir können auch vernünftigerweise davon ausgehen, dass "handle" nicht nur "process" bedeutet, sondern speziell, dass es eine solche Ausnahme nicht (erneut) auslöst.

Diese Annahmen schließen # 1 und # 2 sofort aus.

Die verbleibende Frage ist, ob "einfach beenden" das Auslösen einer Ausnahme oder nur eine explizite return/System.exit() beinhaltet. Im ersteren Fall könnten sowohl # 3 als auch # 4 immer noch wahr sein:

public static void main(String[] args) throws FileNotFoundException {
    try {
        doSomething();
    }
    catch (FileNotFoundException fnfe) {
        throw fnfe;
    }
    catch (Exception e) {
        return;
    }
}

Im letzteren Fall können weder # 3 noch # 4 wahr sein, während auch die Annahme erfüllt ist, dass main()FileNotFoundException wirft.


Insgesamt sind die Optionen nicht gut formuliert. Wenn ich eine Antwort auswählen müsste, wäre es # 3, basierend auf der Logik von MartinVs Antwort. Meine Annahme wäre, dass das Wort "sollte" in # 3 eine unglückliche Entscheidung des Professors war und dass so etwas wie "kann" eine bessere Option gewesen wäre. Es wäre auch eine gute Idee gewesen, eine genauere Sprache zu verwenden als "einfach zu beenden" (und wohl "zu handhaben").

0
Matthew Read

Die Antwort lautet sowohl 2 als auch 3.

2.Die Hauptmethode dient zum Abfangen und Behandeln der FileNotFoundException . 3. Die Hauptmethode sollte einfach beendet werden, wenn die FileNotFoundException auftritt.

Wenn jedoch die Ausnahme nicht behandelt wird, obwohl sie dafür ausgelegt ist und die Programme abnormal beendet werden.

throw-Schlüsselwörter werden verwendet, damit JVM die Ausnahmen behandelt, mit denen wir faul umgehen, es wird erfolgreich kompiliert, zeigt jedoch die Ausnahme zur Laufzeit (wenn Sie es in der Hauptmethode behandeln, wird es kompiliert und erfolgreich ausgeführt).

4.Die Hauptmethode sollte einfach beendet werden, wenn eine Ausnahme auftritt. Ist nicht immer korrekt, da die aufgetretenen Ausnahmen möglicherweise in der Hauptmethode behandelt werden.

1.Die Hauptmethode dient zum Abfangen und Behandeln aller Arten von Ausnahmen. Ist falsch, da JVM nicht ungeprüfte Ausnahmen behandelt.

0
Jaswanth Gorthi
  1. main() wirft letztendlich alle unbehandelte Ausnahmen, richtig? Das effektive Hinzufügen von Würfen FileNotFoundException ist also überflüssig.

  2. Eine throws -Anweisung impliziert nichts darüber, wie eine Methode eine Ausnahme behandelt. Diese main() -Methode kann tatsächlich FileNotFoundException verarbeiten und es dann erneut auslösen.

Diese throws -Anweisung gibt also nichts darüber an, wie eine Ausnahme abgefangen und behandelt wird. Und die Fragen 3 & 4 sind nur gültig, wenn wir davon ausgehen, dass die betreffende Ausnahme nicht behandelt wird. Ohne diese Annahme sind die Fragen unbestimmt. Mit dieser Annahme sind beide 3 & 4 wahr!

Die richtige Antwort ist, die Schule um eine Rückerstattung für diese Klasse zu bitten - auch 6,5 Jahre später.

Könnten Sie bitte die Kontaktinformationen dieses Lehrers weiterleiten? Ich hätte gerne ein Wort mit ihnen.

0
Rick Foster