2016-07-28 9 views
0

Lassen Sie mich das vorwegnehmen, indem ich sage: Ich bin kein Java-Programmierer und konnte bisher nicht verstehen, WARUM dies der Fall ist.Java setOnAction subscribe zu Ereignis, das die Ausnahme auslöst

Ich arbeite gerade an einer Hausaufgabe, die mich erfordert, eine grundlegende GUI mit JavaFX zu erstellen. Die Funktionalität dieser GUI erfordert, dass Schaltflächen vorhanden sind, die CRUD-Vorgänge beim Klicken ausführen. Zur Zeit habe ich alles richtig in meiner Insert-Methode ein:

 public void Insert() throws SQLException{ 

     //Insert new record here 
    } 

Jedes Mal, wenn ich versuche, auf diese Methode ‚setOnAction‘ zu unterzeichnen, der Compiler sagt mir, es gibt eine nicht behandelte Ausnahme auf der Veranstaltung:

btnInsert.setOnAction(e ->Insert()); 

Ich bin neugieriger, wenn es eine Möglichkeit gibt, dies in einer relativ knappen Art und Weise zu behandeln? Bisher konnte ich keine Lösung finden.

Antwort

4

Das liegt daran, dass Java die Deklaration aller geprüften Ausnahmen erfordert. Wenn Sie also eine Methode aufrufen, die eine geprüfte Ausnahme auslöst, müssen Sie sie entweder abfangen oder deklarieren, dass Sie sie selbst auslösen.

Siehe this question für eine Erklärung gegen ungeprüfte Ausnahme geprüft (Die kurze Version - eine Ausnahme, die erbt entweder Error oder RuntimeException nicht markiert ist, während alle anderen Ausnahmen geprüft werden.)

Wenn Sie bieten setOnAction mit einem Lambda, Sie erstellen tatsächlich eine anonyme Klassenimplementierung von . Da es nicht deklariert, wirft es keine Ausnahmen, auch nicht Ihre anonyme Klasse (und tatsächlich - es kann nicht).

So haben Sie zwei Möglichkeiten zur Lösung des Problems:

  1. abfangen und behandeln die Ausnahme:

    btnInsert.setOnAction(e -> { 
        try { 
         Insert(); 
        } catch (SQLException ex) { 
         // Log error, show error message, etc... Whichever is applicable for your application 
        } 
    }); 
    
  2. Rethrow eine un-geprüfte Ausnahme:

    btnInsert.setOnAction(e -> { 
        try { 
         Insert(); 
        } catch (SQLException ex) { 
         throw new RuntimeException(ex); // Or any other subclass of RuntimeException or Error 
        } 
    }); 
    

Wie zu wählen g zwischen den beiden Optionen - Oracle's documentation sagt dies:

Hier ist die untere Zeile Richtlinie: Wenn ein Client zugemutet werden kann von einer Ausnahme erholen, es ist eine geprüfte Ausnahme machen. Wenn ein Client nichts tun kann, um die Ausnahme wiederherzustellen, machen Sie eine unkontrollierte Ausnahme.

Natürlich ist dies alles weg bewegt von der tatsächlichen EventHandler werden konnte, so kann es auf ein Verfahren genannt werden, die ausgecheckten Ausnahme frei ist.

+0

Vielen Dank. Das ist genau die Art von Antwort, nach der ich gesucht habe. –