2016-07-28 15 views
0

让我先说这个,我说,我不是Java程序员,并且迄今一直无法理解为什么会出现这种情况。Java setOnAction订阅引发异常的事件

我目前正在做一个家庭作业,需要我使用JavaFX创建一个基本的GUI。此GUI的功能要求有按钮在点击时执行CRUD操作。目前,我有我的一切插入方法正确设置:

 public void Insert() throws SQLException{ 

     //Insert new record here 
    } 

然而,每当我尝试订阅此方法使用“setOnAction”,编译器告诉我,有一个在事件未处理的异常:

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

如果有办法以相对简洁的方式处理这个问题,我更好奇吗?到目前为止,我一直无法提出解决方案。

回答

4

这是因为Java要求你声明所有你检测到的异常 - 所以无论你何时调用一个可能抛出一个检查异常的方法,你必须捕获它或者声明你可能自己抛出异常。

为检查与未经检查的异常的说明,请参见this question(简短的版本 - 它继承或者ErrorRuntimeException未选中任何异常,而其他所有的异常进行检查。)

当你提供setOnAction用lambda,你实际上创建了一个匿名类实现EventHandler<ActionEvent>。既然它没有声明它抛出任何异常,你的匿名类也不会(事实上 - 它不能)。

所以,你必须解决这个问题的两个选项:

  1. 捕获和处理异常:

    btnInsert.setOnAction(e -> { 
        try { 
         Insert(); 
        } catch (SQLException ex) { 
         // Log error, show error message, etc... Whichever is applicable for your application 
        } 
    }); 
    
  2. 重新抛出一个未检查异常:

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

至于choosin这两个选项克之间 - Oracle's documentation这样说:

这里的底线准则:如果客户可以合理预期从异常中恢复,使它成为一个检查异常。如果客户端无法做任何事情来恢复异常,请将其设为未检查的异常。

当然,这可能全部从实际的EventHandler移开,因此可以在没有检查异常的方法上调用它。

+0

谢谢。这正是我正在寻找的那种答案。 –