it-swarm.com.de

Kann eine Ausnahme ignoriert werden?

Ist es in Java möglich, eine Methode zu erstellen, die eine throws-Anweisung enthält, die nicht geprüft wird. 

Zum Beispiel:

public class TestClass {
    public static void throwAnException() throws Exception {
        throw new Exception();
    }
    public static void makeNullPointer() {
        Object o = null;
        o.equals(0);//NullPointerException
    }
    public static void exceptionTest() {
        makeNullPointer(); //The compiler allows me not to check this
        throwAnException(); //I'm forced to handle the exception, but I don't want to
    }
}
27
Runemoro

Sie können versuchen, nichts dagegen zu unternehmen:

public static void exceptionTest() {
    makeNullPointer(); //The compiler allows me not to check this
    try {
        throwAnException(); //I'm forced to handle the exception, but I don't want to
    } catch (Exception e) { /* do nothing */ }
}

Denken Sie daran, dass dies im wirklichen Leben äußerst schlecht beraten ist . Das kann einen Fehler verbergen und Sie eine ganze Woche lang auf der Suche nach Hunden halten, während das Problem wirklich eine Katze (ch) war. (Komm schon, setze dort mindestens eine System.err.println() - Logging ist hier die beste Methode, wie von @BaileyS vorgeschlagen.)

ngeprüfte Ausnahmen in Java Erweitern Sie die Klasse RuntimeException. Das Werfen von ihnen verlangt von ihren Kunden kein catch:

// notice there's no "throws RuntimeException" at the signature of this method
public static void someMethodThatThrowsRuntimeException() /* no need for throws here */ {
    throw new RuntimeException();
}

Klassen, die RuntimeException erweitern, erfordern ebenfalls keine throws -Deklaration.

Und ein Wort von Oracle darüber:

Im Folgenden finden Sie die grundlegende Richtlinie: Wenn von einem Client erwartet werden kann, dass er eine Ausnahme behebt, machen Sie ihn zu einer aktivierten Ausnahme. Wenn ein Client die Ausnahmebedingung nicht beheben kann, legen Sie sie als ungeprüfte Ausnahmebedingung fest.

55
acdcjunior

In Java gibt es zwei Arten von Exceptions , Checked Exceptions und Uncheckeded Exceptions.

  • Ausnahme ist eine geprüfte Ausnahme, muss gefangen oder geworfen werden. 
  • NullPointerException ist eine RuntimeException , (der Compiler zwingt sie nicht zur Deklarierung), Sie können es ignorieren, aber es kann immer noch in der Runtime und Ihrem Anwendung wird abstürzen.

Aus Ausnahme Dokumentation:

Die Klasse Exception und alle Unterklassen, die keine Unterklassen von .__ sind. RuntimeException sind geprüfte Ausnahmen. Geprüfte Ausnahmen müssen .__ sein. Wird in der Throws-Klausel einer Methode oder eines Konstruktors deklariert, wenn sie .__ sein kann. wird durch die Ausführung der Methode oder des Konstruktors ausgelöst und propagiert außerhalb der Methoden- oder Konstruktorgrenze.

Aus der RuntimeException Dokumentation:

RuntimeException ist die Oberklasse der Ausnahmen, die .__ sein können. wird während des normalen Betriebs der Java Virtual Machine ausgelöst.

RuntimeException und ihre Unterklassen sind ungeprüfte Ausnahmen . Nicht geprüfte Ausnahmen müssen nicht in einer Methode oder .__ deklariert werden. Konstruktor-Throws-Klausel, wenn sie durch die Ausführung von .__ ausgelöst werden können. die Methode oder den Konstruktor und verbreiten sie außerhalb der Methode oder Konstruktorgrenze.

3
tarrsalah

Es gibt 3 Dinge, die Sie tun können:

  • Werfen Sie eine RuntimeException (oder etwas, das eine RuntimeException erweitert, wie NullPointerException, IllegalArgumentException, ...). Sie müssen diese nicht abfangen, da es sich um ungeprüfte Ausnahmen handelt.

  • Die Ausnahme abfangen und nichts tun (nicht empfohlen):

    public static void exceptionTest() {
        makeNullPointer(); //The compiler allows me not to check this
        try {
            throwAnException(); //I'm forced to handle the exception, but I don't want to
        } catch (Exception e) {
            // Do nothing
        }
    }
    
  • Ändern Sie die exceptionTest ()-Deklaration so, dass sie eine Exception auslöst, und lassen Sie die aufrufende Methode die Exception einfangen, und tun Sie, was angemessen ist:

    public static void exceptionTest() throws Exception {
        makeNullPointer(); //The compiler allows me not to check this
        throwAnException(); //I'm no more forced to handle the exception
    }
    
3
Florent Bayle

Sie können eine Lücke im Java-Compiler verwenden. Fügen Sie den folgenden Code hinzu:

public RuntimeException hideThrow(Throwable e) {
    if (e == null)
        throw new NullPointerException("e");
    this.<RuntimeException>hideThrow0(e);
    return null;
}

@SuppressWarnings("unchecked")
private <GenericThrowable extends Throwable> void hideThrow0(Throwable e) throws GenericThrowable {
    throw (GenericThrowable) e;
}

Sie können die Ausnahme abfangen und dann hideThrow mit der Ausnahme aufrufen, um sie zu werfen, ohne dass der Compiler dies bemerkt. Dies funktioniert wegen der Löschung des Typs. Zum Zeitpunkt des Kompilierens steht GenericThrowable für RuntimeException, da wir dies passieren. Zur Laufzeit stellt GenericThrowableThrowable dar, da dies der Basistyp in der Typparameterspezifikation ist.

3
Bailey Ridley

Nein, es wird ein Compiler-Fehler ausgelöst. Da es sich um eine geprüfte Ausnahme handelt, müssen Sie sie entweder abfangen oder propagieren, indem Sie Ihre Methode als potenziell auslösend deklarieren. _ Überprüfen Sie this und this .

2
LexLythius

Die anderen Antworten sind insofern richtig, als sie Ihnen korrekt mitteilen, was Sie sollten tun, aber es ist tatsächlich möglich ist, eine nicht deklarierte geprüfte Ausnahme auszulösen. Es gibt verschiedene Möglichkeiten, dies zu tun. das einfachste ist:

public void methodThatSecretlyThrowsAnException() {
    Thread.currentThread().stop(new Exception());
}

oder wenn es Ihr Ziel ist, eine vorhandene Methode zu verpacken, die ihre Ausnahme deklariert

public void methodThatSecretlyThrowsAnException() {
    try {
        methodThatAdmitsItThrowsAnException();
    } catch(final Exception e) {
        Thread.currentThread().stop(e);
    }
}

(Selbstverständlich sollten Sie dies niemals tun.)

1
ruakh

Wie ich weiß, ist es in dem Fall unmöglich. Nur eine ungeprüfte Ausnahme kann der Compiler zur Überprüfung überspringen. wie RuntimeException.

1
Stony

Wirft eine RuntimeException oder eine Ausnahme, die von RuntimeException abgeleitet ist. Dann wird der Compiler Sie nicht zwingen, es zu fangen.

1
user93353

Fangen Sie einfach eine Ausnahme und tun Sie nichts damit, lassen Sie es so wie es ist und nehmen Sie die generische Ausnahme, falls Sie die bestimmte Ausnahme nicht kennen

try{
//Your logic goes here
}
catch(Exception e)//Exception is generic
{
//do nothing
}
1
Rahul Saksule

Es ist nicht ratsam, eine Ausnahme mit einem leeren catch-Block zu vermeiden, obwohl Sie absolut sicher sind, dass unter keinen Umständen ein Fehler auftritt. Manchmal sind wir uns des menschlichen Faktors nicht bewusst.

Wenn Sie sicher sind, dass eine Ausnahme sehr unwahrscheinlich ist (wenn nicht unmöglich), sollten Sie Ihre eigene Ausnahme erstellen und die unerwartete Ausnahme darin einschließen.

Zum Beispiel:

private class UnlikelyException extends RuntimeException {
    public UnlikelyException (Exception e){
        super (e);
    }
}

Wickeln Sie dann Ihren Code mit einem try-catch-Block um und werfen Sie Ihre Ausnahme, die Sie nicht abfangen müssen

try {
    // Your code
} catch  (Exception e) {
    throw new UnlikelyException(e);
}
0
JCalcines