Java连接MariaDB时声明SQLException仍报错的问题排查
问题分析与解决方案
你的代码核心矛盾在于方法声明抛出异常,但内部已经捕获了该异常,导致编译器的判定逻辑冲突,进而引发编译错误。
错误原因拆解
- db类的run方法矛盾:你在
run()方法签名上声明了throws SQLException,但方法内部已经通过try-catch块捕获并处理了SQLException——这意味着该异常根本不会传播到方法外部,但编译器会严格按照方法签名的声明要求调用者处理异常。 - Start类调用未处理异常:Start的构造方法调用
myDb.run()时,编译器看到run()声明可能抛出SQLException,但构造方法既没有用try-catch捕获该异常,也没有在自身签名上声明throws SQLException,因此触发编译错误。
解决方案(推荐第一种)
方案一:移除run方法的throws SQLException声明
既然你已经在方法内部处理了异常,就不需要再向外抛出,修改db类代码:
public class db { public void run() { // 移除throws SQLException声明 try { // JDBC 4.0+无需手动注册驱动,可删除此行:Class.forName("com.mysql.cj.jdbc.Driver"); Connection cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/project", "rizkiaswangga", ""); } catch (SQLException e) { System.out.println(e.getMessage()); } catch (Exception e) { System.out.println(e.getMessage()); } } }
修改后,run()方法不会向外抛出检查型异常,Start类的构造方法调用时即可正常编译。
方案二:让调用者处理异常(不推荐)
如果坚持保留run()方法的throws SQLException声明,需修改Start类的构造方法,二选一:
- 在构造方法内捕获异常:
public class Start extends javax.swing.JFrame { public Start() { initComponents(); db myDb = new db(); try { myDb.run(); } catch (SQLException e) { e.printStackTrace(); // 或自定义异常处理逻辑 } } }
- 构造方法声明抛出异常:
public class Start extends javax.swing.JFrame { public Start() throws SQLException { // 构造方法声明抛出异常 initComponents(); db myDb = new db(); myDb.run(); } }
注:此方式不推荐,因为构造方法抛出异常会导致窗口实例化失败,影响程序启动。
内容的提问来源于stack exchange,提问作者Rizki Aswangga Adiluhur
相关产品推荐
相关产品推荐

