Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java setOnAction订阅引发异常的事件_Java_Events_Javafx - Fatal编程技术网

Java setOnAction订阅引发异常的事件

Java setOnAction订阅引发异常的事件,java,events,javafx,Java,Events,Javafx,让我先说一句,我不是Java程序员,到目前为止还无法理解为什么会出现这种情况 我目前正在做一项家庭作业,要求我使用JavaFX创建一个基本的GUI。此GUI的功能要求在单击时有执行CRUD操作的按钮。目前,我已在插入方法中正确设置了所有内容: public void Insert() throws SQLException{ //Insert new record here } 但是,每当我尝试使用“setOnAction”订阅此方法时,编译器都会告诉

让我先说一句,我不是Java程序员,到目前为止还无法理解为什么会出现这种情况

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

        public void Insert() throws SQLException{

        //Insert new record here
    }
但是,每当我尝试使用“setOnAction”订阅此方法时,编译器都会告诉我事件上存在未处理的异常:

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

我更好奇的是,是否有一种相对简洁的方式来处理这个问题?到目前为止,我还无法想出一个解决方案。

这是因为Java要求您声明您抛出的所有已检查异常-因此,每当您调用可能抛出已检查异常的方法时,您必须捕获它或声明您可以自己抛出它

有关选中与未选中异常的解释,请参阅短版本-继承错误或RuntimeException的任何异常均未选中,而所有其他异常均已选中

使用lambda提供setOnAction时,实际上是在创建的匿名类实现。因为它没有声明抛出任何异常,所以匿名类也没有,事实上,它不能

因此,您有两种解决问题的方法:

捕获并处理异常:

btnInsert.setOnAction(e -> {
    try {
        Insert();
    } catch (SQLException ex) {
        // Log error, show error message, etc... Whichever is applicable for your application
    }
});
btnInsert.setOnAction(e -> {
    try {
        Insert();
    } catch (SQLException ex) {
        throw new RuntimeException(ex); // Or any other subclass of RuntimeException or Error
    }
});
重新显示未检查的异常:

btnInsert.setOnAction(e -> {
    try {
        Insert();
    } catch (SQLException ex) {
        // Log error, show error message, etc... Whichever is applicable for your application
    }
});
btnInsert.setOnAction(e -> {
    try {
        Insert();
    } catch (SQLException ex) {
        throw new RuntimeException(ex); // Or any other subclass of RuntimeException or Error
    }
});
关于在这两个选项中进行选择,如下所示:

下面是一条底线指导原则:如果可以合理地期望客户机从异常中恢复,则将其设置为已检查的异常。如果客户端无法从异常中恢复,请将其设置为未检查的异常


当然,这一切都可以从实际的EventHandler中移开,因此可以在检查为无异常的方法上调用它

这是因为Java要求您声明抛出的所有已检查异常——因此,每当您调用可能抛出已检查异常的方法时,您必须捕获它或声明您可以自己抛出它

有关选中与未选中异常的解释,请参阅短版本-继承错误或RuntimeException的任何异常均未选中,而所有其他异常均已选中

使用lambda提供setOnAction时,实际上是在创建的匿名类实现。因为它没有声明抛出任何异常,所以匿名类也没有,事实上,它不能

因此,您有两种解决问题的方法:

捕获并处理异常:

btnInsert.setOnAction(e -> {
    try {
        Insert();
    } catch (SQLException ex) {
        // Log error, show error message, etc... Whichever is applicable for your application
    }
});
btnInsert.setOnAction(e -> {
    try {
        Insert();
    } catch (SQLException ex) {
        throw new RuntimeException(ex); // Or any other subclass of RuntimeException or Error
    }
});
重新显示未检查的异常:

btnInsert.setOnAction(e -> {
    try {
        Insert();
    } catch (SQLException ex) {
        // Log error, show error message, etc... Whichever is applicable for your application
    }
});
btnInsert.setOnAction(e -> {
    try {
        Insert();
    } catch (SQLException ex) {
        throw new RuntimeException(ex); // Or any other subclass of RuntimeException or Error
    }
});
关于在这两个选项中进行选择,如下所示:

下面是一条底线指导原则:如果可以合理地期望客户机从异常中恢复,则将其设置为已检查的异常。如果客户端无法从异常中恢复,请将其设置为未检查的异常


当然,这一切都可以从实际的EventHandler中移开,因此可以在检查为无异常的方法上调用它

多谢各位。这正是我想要的答案。谢谢。这正是我想要的答案。