Unterdrückte Ausnahmen in Java 7

Zu jedem Zeitpunkt kann von einer Methode pro Ausführung nur eine Ausnahme ausgelöst werden. In Fällen, in denen mehr als eine Ausnahme von der Methode ausgelöst würde, wird eine davon unterdrückt und nicht vom Compiler ausgelöst. Diese Ausnahme wird in Java als unterdrückte Ausnahme bezeichnet.

  • Zusätzliche Lektüre: Tutorial zu Java-Ausnahmen

In Java 7 ist das häufigste Szenario zum Erhalten der unterdrückten Ausnahme die Verwendung der try-with-resource-Anweisung. Die Try with resources-Anweisung ist eine spezielle Art von Try-Block, der in Java 7 von Try eingeführt wurde und keinen Catch- oder Finaly-Block erfordert.

Beispiel für unterdrückte Ausnahmen in Java 7

Beispiel für unterdrückte Ausnahmen

Wenn Sie die Anweisung „try with resources“ verwenden, tritt zunächst eine Ausnahme im Try-Block auf und dann wird wahrscheinlich beim Schließen der Ressource eine weitere Ausnahme auftreten. Die zweite Ausnahme wird implizit ausgelöst und daher unterdrückt. Da beim Schließen der Ressourcen mehrere Ausnahmen ausgelöst werden, werden zusätzliche Ausnahmen als unterdrückte Ausnahmen an die primäre Ausnahme angehängt.

Java 7 hat einen neuen Konstruktor und zwei neue Methoden hinzugefügt Throwable Klasse wie folgt:

Throwable.getSupressed(); // Returns Throwable[]
Throwable.addSupressed(aThrowable);

Schauen wir uns ein einfaches Beispiel für die Verwendung der unterdrückten Ausnahmemethoden in an Throwable Klasse zum Abrufen der unterdrückten Ausnahmen.

Hier ist die Implementierung für die Resource-Klasse

public class Resource implements AutoCloseable {
	public void use() {
		throw new RuntimeException("This exception in the use method");
	}

	@Override
	public void close() throws Exception {
		throw new NullPointerException("This exception in the close method");
	}
}

Schauen wir uns nun die verschiedenen Szenarien an, um die unterdrückten Ausnahmen vor Java 7 und nach der Java 7-Unterstützung zu verstehen.

1. Unterstützung ohne unterdrückte Ausnahmen

import static java.lang.System.err;

public class ExceptionExample {
	public static void test() throws Exception {
		Resource resource = new Resource();
		try {
			resource.use();
		} finally {
			resource.close();
		}
	}

	public static void main(String args[]) {
		try {
			test();
		} catch (Exception ex) {
			err.println("Exception encountered: " + ex.toString());
			final Throwable[] suppressedExceptions = ex.getSuppressed();
			final int numSuppressed = suppressedExceptions.length;
			if (numSuppressed > 0) {
				err.println("There are " + numSuppressed
						+ " suppressed exceptions:");
				for (final Throwable exception : suppressedExceptions) {
					err.println("tt" + exception.toString());
				}
			}
		}
	}
}

Die Ausgabe für das obige Programm wird sein:

Exception encountered: java.lang.NullPointerException: This exception in the close method

Wie Sie gesehen haben, wird nur die erste Ausnahme gedruckt.

2. Unterstützung unterdrückter Ausnahmen in Java 7

import static java.lang.System.err;

public class ExceptionExample1 {
	public static void test() throws Exception {
		Throwable throwable = null;
		Resource resource = new Resource();
		try {
			resource.use();
		}catch (Exception e) {
			throwable = e;
		} finally {
			try{
				resource.close();
			}catch (Exception e){
				if (throwable != null){
					e.addSuppressed(throwable);				
					throw e;
				}
			}
		}
	}

	public static void main(String args[]) throws Exception{
		try {
			test();
		} catch (Exception ex) {
			err.println("Exception encountered: " + ex.toString());
			final Throwable[] suppressedExceptions = ex.getSuppressed();
			final int numSuppressed = suppressedExceptions.length;
			if (numSuppressed > 0) {
				err.println("There are " + numSuppressed
						+ " suppressed exceptions:");
				for (final Throwable exception : suppressedExceptions) {
					err.println("" + exception.toString());
				}
			}
		}
	}
}

Die Ausgabe für das obige Programm wird sein:

Exception encountered: java.lang.NullPointerException: This exception in the close method
tThere are 1 suppressed exceptions:
java.lang.RuntimeException: This exception in the use method

Wenn Sie sich die obige Ausgabe ansehen, können wir jetzt beide Ausnahmen aus der Liste abrufen. Die erste ist die primäre Ausnahme und die zweite die zusätzliche Ausnahme.

3. Standard-Try-with-Resource-Block

Hier ist der Beispielcode:

public class ExceptionExample {
	public static void main(String args[]) throws Exception{
		try (Resource resource= new Resource())
	      {
	          resource.use();
	      }
	}
}

Wenn Sie das obige Programm ausführen, werden die folgenden Ausnahmen angezeigt:

Exception in thread "main" java.lang.RuntimeException: This exception in the use method
	at net.infy.exception.Resource.use(Resource.java:5)
	at net.infy.exception.ExceptionExample1.main(ExceptionExample1.java:8)
	Suppressed: java.lang.NullPointerException: This exception in the close method
		at net.infy.exception.Resource.close(Resource.java:10)
		at net.infy.exception.ExceptionExample1.main(ExceptionExample1.java:9)

Wenn man die obigen Beispiele vergleicht, wird deutlich, dass Java 7 einen Großteil des Codes und der Behandlung der automatisch unterdrückten Ausnahmen reduziert hat. Wenn Sie Fragen haben, schreiben Sie diese bitte in den Kommentarbereich.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen