statement.executeQuery() 谜团。代码未被执行,也未捕获异常。
statement.executeQuery() mystery. Code not being executed, nor exception is being caught.
提供代码和输出。搜索互联网但没有找到解决方案。一切都编译和运行正常,直到“//PROBLEMATIC LINE”,执行直接进入“//HERE”,没有任何指示,异常或错误。我已经多次将此代码与 SQLServer 的 jdbc 驱动程序一起使用并且工作正常,我可能在这里遗漏了什么?在同一个应用程序中,我也将此代码与 mySql jdbc 驱动程序一起使用,并且再次工作正常。就是在这段代码中是有问题的。显然我正在使用 java.sql.*; .
try {
Class.forName(driver);
setResponse("Failure. 1");
connectionTest = DriverManager.getConnection(url, username, password);
setResponse("Failure. 2");
String query = "SELECT TOP (1) [id] FROM "+ table + ";";
PreparedStatement statement = connectionTest.prepareStatement(query);
setResponse("Failure. 3");
System.out.println(statement);
ResultSet resultset = statement.executeQuery(); //PROBLEMATIC LINE
System.out.println("DOES NOT EVEN PRINT THIS");
setResponse("Failure. 4");
if (resultset.first()) setResponse("Success.");
else setResponse("Failure. 5");
System.out.println("Query success: ");
setResponse("Failure. 6");
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try {
connectionTest.close(); //HERE
return getResponse();
}
catch (Exception e) {
e.printStackTrace();
return getResponse();
}
}
输出:
------------------------------------
-------------DATABASES--------------
------------------------------------
SQLServerPreparedStatement:1
Failure. 3
------------------------------------
----------TESTS COMPLETED-----------
------------------------------------
当抛出异常时,try
块将退出。当 try
块退出时,将执行 finally
块。由于您的 finally
块中有 return
语句,因此您永远不会到达 catch
块。
不要在 finally
块中 return
。然后将打印堆栈跟踪,您可以处理异常。
正如其他人提到的那样,您应该做一些不同的 try-catch 事情。我的推荐:
try {
Class.forName(driver);
setResponse("Failure. 1");
connectionTest = DriverManager.getConnection(url, username, password);
setResponse("Failure. 2");
String query = "SELECT TOP (1) [id] FROM "+ table ;
PreparedStatement statement = connectionTest.prepareStatement(query);
setResponse("Failure. 3");
System.out.println(query);
ResultSet resultset = statement.executeQuery();
while ( resultset.next() {
System.out.println("only one result because of 'top (1)': " + rs.getInt(1));
}
resultset.close();
statement.close();
connectionTest.close();
} catch { SQLException sqlex) {
System.out.println(getClass().getName() + " SQLException: " + sqlex.getMessage();
} catch (Exception e) {
System.out.println(getClass().getName() + " GenericException: " + e.getMessage();
e.printStrackTrace();
}
如果所有需要的库都在类路径中,尤其是 JDBC-Driver,它应该没问题
提供代码和输出。搜索互联网但没有找到解决方案。一切都编译和运行正常,直到“//PROBLEMATIC LINE”,执行直接进入“//HERE”,没有任何指示,异常或错误。我已经多次将此代码与 SQLServer 的 jdbc 驱动程序一起使用并且工作正常,我可能在这里遗漏了什么?在同一个应用程序中,我也将此代码与 mySql jdbc 驱动程序一起使用,并且再次工作正常。就是在这段代码中是有问题的。显然我正在使用 java.sql.*; .
try {
Class.forName(driver);
setResponse("Failure. 1");
connectionTest = DriverManager.getConnection(url, username, password);
setResponse("Failure. 2");
String query = "SELECT TOP (1) [id] FROM "+ table + ";";
PreparedStatement statement = connectionTest.prepareStatement(query);
setResponse("Failure. 3");
System.out.println(statement);
ResultSet resultset = statement.executeQuery(); //PROBLEMATIC LINE
System.out.println("DOES NOT EVEN PRINT THIS");
setResponse("Failure. 4");
if (resultset.first()) setResponse("Success.");
else setResponse("Failure. 5");
System.out.println("Query success: ");
setResponse("Failure. 6");
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try {
connectionTest.close(); //HERE
return getResponse();
}
catch (Exception e) {
e.printStackTrace();
return getResponse();
}
}
输出:
------------------------------------
-------------DATABASES--------------
------------------------------------
SQLServerPreparedStatement:1
Failure. 3
------------------------------------
----------TESTS COMPLETED-----------
------------------------------------
当抛出异常时,try
块将退出。当 try
块退出时,将执行 finally
块。由于您的 finally
块中有 return
语句,因此您永远不会到达 catch
块。
不要在 finally
块中 return
。然后将打印堆栈跟踪,您可以处理异常。
正如其他人提到的那样,您应该做一些不同的 try-catch 事情。我的推荐:
try {
Class.forName(driver);
setResponse("Failure. 1");
connectionTest = DriverManager.getConnection(url, username, password);
setResponse("Failure. 2");
String query = "SELECT TOP (1) [id] FROM "+ table ;
PreparedStatement statement = connectionTest.prepareStatement(query);
setResponse("Failure. 3");
System.out.println(query);
ResultSet resultset = statement.executeQuery();
while ( resultset.next() {
System.out.println("only one result because of 'top (1)': " + rs.getInt(1));
}
resultset.close();
statement.close();
connectionTest.close();
} catch { SQLException sqlex) {
System.out.println(getClass().getName() + " SQLException: " + sqlex.getMessage();
} catch (Exception e) {
System.out.println(getClass().getName() + " GenericException: " + e.getMessage();
e.printStrackTrace();
}
如果所有需要的库都在类路径中,尤其是 JDBC-Driver,它应该没问题