JavaFX表单输入插入数据库报InvocationTargetException如何解决?
代码错误点汇总及修复方案
1 空指针报错(NullPointerException)根本原因
- 首先确认Controller中所有
@FXML注解的控件和FXML文件中对应控件的fx:id完全一致,只要有一个控件的fx:id和变量名不匹配,该控件变量就会为null,调用getText()、getValue()等方法时就会触发空指针,你可以在报错的第73行位置打断点,排查具体哪个变量为null。 - 若
DatePicker控件用户未选择日期时直接调用getValue()会返回null,没有做非空校验直接使用也会触发空指针,建议添加必填校验逻辑,用户未填写对应字段时先弹出提示拦截,不要直接执行数据库操作。
2 逻辑错误汇总
2.1 驱动加载顺序&驱动类错误
- 驱动加载要放在获取数据库连接之前,正确顺序是先执行
Class.forName再调用DriverManager.getConnection。 - 如果你使用的是MySQL 8.0以上版本的JDBC驱动,旧的
com.mysql.jdbc.Driver已经废弃,要替换为com.mysql.cj.jdbc.Driver,同时JDBC URL建议加上时区参数避免时间报错:jdbc:mysql://localhost/medibase?serverTimezone=Asia/Shanghai。
2.2 控件取值逻辑完全错误
- 手机号取值错误:
phone.getColumns()是获取TextField的列宽属性值,不是用户输入的手机号内容,正确写法是phone.getText(),另外手机号一般为11位,超过了int类型的存储上限(int最大值为2147483647,仅10位),建议数据库中该字段改为varchar类型,直接存储字符串即可,不需要转数字。 - 日期取值错误:
date.getPromptText()是获取DatePicker的提示占位文字(比如你设置的“请选择日期”这类提示),不是用户选择的日期,正确写法是date.getValue(),返回LocalDate类型,可以转成java.sql.Date或者格式化后字符串存入数据库。
2.3 SQL参数顺序错误
你INSERT语句的字段顺序为:Patient_Name,Patient_ID,Docter_Name,Patient_Phone,App_Date,Covid_Note,App_time,但你设置参数的顺序把日期和时间搞反了:
- 第5个参数你设置的是
atime(预约时间),但第5个字段是App_Date(预约日期) - 第7个参数你设置的是
appdate(预约日期),但第7个字段是App_time(预约时间)
需要调整参数顺序,和字段顺序一一对应。
2.4 拼写风险
- 预约的正确拼写是
appointment,你写的appoinment少了一个t,医生的正确拼写是Doctor,你写的Docter少了一个c,如果数据库表名、字段名是正确拼写,你SQL里的名称和数据库不一致也会执行失败。
2.5 资源泄漏问题
Connection、PreparedStatement属于数据库资源,使用完后必须关闭,建议使用try-with-resources语法自动关闭资源,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Banchi Secret
相关产品推荐
相关产品推荐

