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)


25 Kasım 2019 Pazartesi

JSR223 ScriptEngineManager Sınıfı

Giriş
Şu satırı dahil ederiz. Bir ScriptEngine nesnesi yaratır.
import javax.script.ScriptEngineManager;
Açıklaması şöyle
The Java Scripting API (JSR 223) is a set of classes and interfaces stored in the relatively small and simple javax.script package. The  ScriptEngineManager class is the entry point to discover script engines through the JAR file service discovery mechanism, and to instantiate ScriptEngine objects that interpret scripts written in a specific scripting language.
constructor
Şöyle yaparız.
ScriptEngineManager mgr = new ScriptEngineManager();
getEngineByName metodu
ScriptEngine nesnesi oluşturur.

Örnek - js
Şöyle yaparız.
ScriptEngine engine = mgr.getEngineByName("js");
Örnek - javascript
Şöyle yaparız.
ScriptEngine engine = mgr.getEngineByName("JavaScript");
Örnek - nashorn
Açıklaması şöyle. Java 11 ile deprecate edildi. 
Removal of Nashorn JavaScript Engine: Nashorn, which is a JavaScript engine that was included in previous versions of Java, has been removed in Java 20. This engine was deprecated since Java 11, so this shouldn’t come as a surprise to anyone.
Nashorn JDK 15 ile gelmiyor artık. Şöyle yaparız.
NashornScriptEngine engine = (NashornScriptEngine) new ScriptEngineManager()
  .getEngineByName("nashorn");
Örnek - groovy
Elimizde şöyle bir groovy kodu olsun.
class MyScript {

  void sayHello() {
    println "Hello world"
  }
}

new MyScript()
Şöyle yaparız.
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("groovy");

Object object = engine.eval(new FileReader("MyScript.groovy"));
Method method = object.getClass().getDeclaredMethod("sayHello");
method.invoke(object);





24 Kasım 2019 Pazar

RxJava Flowable Sınıfı

Giriş
Flowable ve Observable farklı şeyler. Açıklaması şöyle.
The difference between Observable and Flowable is that Flowable handles back-pressure (implementing the reactive streams protocol) while Observable does not. Flowable is better suited for large streams of data coming from a backpressure-supporting source (for example, a TCP connection) while Observable is better suited for handling “hot” observables for which backpressure cannot be applied (for example, GUI events).
collect metodu
Flowable bir başka veriyapısına döndürülür.
Örnek
Şöyle yaparız.
source.collect(
    HashMultimap::create, 
    (mmap, item) -> mmap.put(item.first, item.second)
)
onBackpressureBuffer metodu
Örnek
Şöyle yaparız
var stream = Stream.generate(Math::random);

//RxJava
Flowable.fromStream(stream)
  .onBackpressureBuffer(0); //Throw is producer overflows

//Project Reactor
Flux.fromStream(stream)
  .onBackpressureError(); //Throw is producer overflows
subscribe metodu
Örnek
Şöyle yaparız.
networkCall()
  .subscribe( 
    success -> { ... }, 
    error -> { doSomethingWhenErrorHappened() }
   );

private Flowable<String> netWorkCall() {
     return networkAvailable() ? Flowable.just(...) : Flowable.error(...);          
}


20 Kasım 2019 Çarşamba

JavaFX FXMLLoader Sınıfı

Giriş
Bu sınıfın yüklediği bileşen Scene ile kullanılabilir. Açıklaması şöyle
... you can create a JavaFX user-interface by taking two different approaches:

1. Define all objects in pure Java code.
2. Use XML-based layout files (FXML) that integrate with Java code.
Örnek
Şöyle yaparız.
Parent root = FXMLLoader.load(...);
Scene scene = new Scene(root);
Örnek
Ana ekranı açmak için şöyle yaparız.
FXMLLoader fxmlLoader = new FXMLLoader(chartResource.getURL());
Parent parent = fxmlLoader.load();
Stage stage = ...
stage.setScene(new Scene(parent, 800, 600));
stage.show();
load metodu
Örnek
Dosyadan yüklemek için şöyle yaparız.
FXMLLoader.load(new URL("file:////Login.fxml"));
Örnek
Şöyle yaparız.
Parent root = FXMLLoader.load(
  getClass().getClassLoader().getResource("scenes/Login.fxml"));