public class SetupConnection{
public static Statement setCon(){
Connection con=null;
Statement st=null;
try{
Class.forName("com.mysql.jdbc.Driver").newInstance();
con=DriverManager.getConnection(
"jdbc:mysql://localhost:3306/zomatocrm","root","");
st = con.createStatement();
}
catch(ConnectException err){
JOptionPane.showMessageDialog(null, "Connection refused!!!");
System.out.println(err.getMessage());
}
catch(Exception e){
System.out.println(e.getMessage());
}
return st;
}
警告:
异常永远不会在try语句的主体中抛出
即将出现在catch(ConnectException){
行。
答案 0 :(得分:2)
你的try块中没有代码:
Class.forName("com.mysql.jdbc.Driver").newInstance();
con=DriverManager.getConnection(
"jdbc:mysql://localhost:3306/zomatocrm","root","");
st = con.createStatement();
...可以抛出ConnectException
。因此,编译器会警告您此catch
子句:
catch(ConnectException err){
JOptionPane.showMessageDialog(null, "Connection refused!!!");
System.out.println(err.getMessage());
}
是多余的。如果将其删除,警告就会消失。
答案 1 :(得分:1)
getConnection
和createStatement
抛出SQLException
,它会在您的第二个捕获区中被捕获。永远不会抛出ConnectException
......
答案 2 :(得分:1)
请注意,如果由于网络问题导致与数据库的连接失败,您仍然只会获得SQLException
,因此捕获更好,如果您想确定是否存在网络问题,您可以检查SQLState
(根据the manual):
try {
...
} catch (SQLException sqle) {
if ("08S01".equals(sqle.getSQLState())) {
JOptionPane.showMessageDialog(null, "Connection refused (or networking problem)!!!");
System.out.println(err.getMessage());
}
}
另外(作为一般观点,与此错误无关),您的方法会创建一个连接(con
对象),但是不会返回对它的引用,那么如何关闭连接?不关闭连接可能会导致连接泄漏,这会导致问题。
答案 3 :(得分:1)
你的真实问题已得到其他人的回答。我只是想指出这个......
catch (Exception e) {
System.out.println(e.getMessage());
}
return st;
... 非常糟糕的代码。
您正在做的是将堆栈跟踪转储到stderr
,然后继续,好像什么都没发生一样。问题是:
你刚抓到的Exception
可能是由各种各样的事情造成的,其中一些不应该被忽视,
stderr流可能没有连接,
(可能更糟)原始堆栈跟踪可以显示给非Java文化用户,他们不会理解它,也可能忽略它或者吓坏了!