26 Kasım 2019 Salı

Throwable Sınıfı

Giriş
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

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.
private String detailMessage;
addSuppressed metodu
Java 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.

printStackTrace metodu
Ö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ır
java.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)


Hiç yorum yok:

Yorum Gönder