Giriş
Java dilinde 3 çeşit exception var
Java dilinde 3 çeşit exception var
1. Checked Exception
2. Unchecked Exception
3. Error
1. Checked Exception Sınıfları
IOException, SQLException gibi sınıflardır. catch() ile yakalanmaları mecburidir.
2. Unchecked Exception Sınıfları
RuntimeException sınıfından kalıtırlar. ArithmeticException, NullPointerException gibi sınıflardır.
catch() ile yakalanmaları mecburi değildir.
3. Error Sınıfları
Error sınıfları JVM tarafından fırlatılır. Normalde kendimizin Error sınıfından kalıtan bir şey fırlatmamıza gerek yoktur. Bazı error sınıfları şöyle
StackOverflowError
OutOfMemoryError
VirtualMachineError
AssertionError
StackOverflowError
OutOfMemoryError
VirtualMachineError
AssertionError
Throwable Sınıfı Nedir
Tüm bu exception çeşitlerinin atasıdır. Throwable sınıfının kendisini fırlatmak iyi bir fikir değil. Kalıtmı şöyle
details Alanı
İçinde şöyle bir alan bulunur.
Java 7 ile eklendi. Mevcut exception'a yenilerini ekler. Şöyle yaparız.
printStackTrace metodu
İçinde şöyle bir alan bulunur.
private String detailMessage;
addSuppressed metoduJava 7 ile eklendi. Mevcut exception'a yenilerini ekler. Şöyle yaparız.
Exception exception = null;
for (Foobar foobar : foobars) {
try {
foobar.frobnicate();
} catch (Exception ex) {
if (exception == null) {
exception = ex;
} else {
exception.addSuppressed(ex);
}
}
}
if (exception != null) {
throw new SomethingWentWrongException(exception);
}
getCause metodu
cause alanı kod içinde this değerine eşitleniyor. Yani şöyle
private Throwable cause = this;
Ama getCause() metodu eğer kendi kendine eşitse null değeri dönüyor. Açıklaması şöyle
... the getCause() method of Throwable doesn't ever return this, it returns null if cause == this. So although your debugger is showing the this reference as the cause because it is using reflection, when using the public interface of Throwable you won't see it and so it won't be a problem.
Örnek
Şöyle yaparız
class Scratch {
public static void main(String[] args) {
Exception exception1 = new Exception("exception 1");
Exception exception2 = new Exception("exception 2", exception1);
StringWriter stringWriter = new StringWriter();
exception2.printStackTrace(new PrintWriter(stringWriter));
System.out.printf(stringWriter.toString());
}
}
Çıktı olarak şunu alırız. Yani önce en son exception yazılır, daha sonra varsa cause yazılırjava.lang.Exception: exception 2
at Scratch.main(scratch_6.java:7)
Caused by: java.lang.Exception: exception 1
at Scratch.main(scratch_6.java:6)