statement.executeQuery()的奥秘。代码未被执行,也没有捕获到异常。
statement.executeQuery()的奥秘。代码未被执行,也没有捕获到异常。
提供了代码和输出。在互联网上搜索,但没有找到解决方案。一切都编译和运行正常,直到“//PROBLEMATIC LINE”为止,执行直接跳到“//HERE”,没有任何指示、异常或错误。我已经多次使用过这个代码与SQLServer的jdbc驱动程序一起使用,并且运行良好,在这里可能遗漏了什么?在同一个应用程序中,我还使用这个代码与mySql jdbc驱动程序,同样也运行正常。只是在这段代码中有一个问题。显然我正在使用java.sql.*;。\n尝试 {\n Class.forName(driver);\n setResponse(\"Failure. 1\");\n connectionTest = DriverManager.getConnection(url, username, password);\n setResponse(\"Failure. 2\");\n String query = \"SELECT TOP (1) [id] FROM \"+ table + \";\";\n PreparedStatement statement = connectionTest.prepareStatement(query);\n setResponse(\"Failure. 3\");\n System.out.println(statement);\n ResultSet resultset = statement.executeQuery(); //PROBLEMATIC LINE\n System.out.println(\"DOES NOT EVEN PRINT THIS\");\n setResponse(\"Failure. 4\");\n if (resultset.first()) setResponse(\"Success.\");\n else setResponse(\"Failure. 5\");\n System.out.println(\"Query success: \"); \n setResponse(\"Failure. 6\");\n}\ncatch (Exception e) {\n e.printStackTrace();\n}\nfinally {\n try {\n connectionTest.close(); //HERE\n return getResponse();\n }\n catch (Exception e) {\n e.printStackTrace();\n return getResponse();\n }\n}\n输出:\n------------------------------------\n-------------数据库--------------\n------------------------------------\nSQLServerPreparedStatement:1\nFailure. 3\n------------------------------------\n----------测试完成-----------\n------------------------------------
问题出现的原因是代码中存在语法错误,导致代码没有被执行,也没有捕获到异常。具体来说,代码中的try-catch语句块中,catch语句的括号没有正确关闭,并且在捕获异常时没有加上大括号。解决方法是将代码中的错误进行修复,确保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.printStackTrace(); }
如果所有必需的库都在类路径中,特别是JDBC驱动程序,代码应该可以正常执行。
当异常被抛出时,try块将退出。当try块退出时,finally块将被执行。由于finally块中有return语句,因此永远不会执行catch块。
在finally块中不要使用return语句。这样堆栈跟踪将被打印出来,您可以处理异常。
finally块在第一个catch块之前执行吗?
是的,是的。可以参考这里:docs.oracle.com/javase/tutorial/essential/exceptions/…。
.O.Balance如何在finally块中不使用return...我的方法必须返回一个语句。如果try块中没有抛出异常,finally必须返回..
基本上说的是finally块总是在try块退出后执行
。我的意思是如果try块中抛出了异常。如果是这样的话,catch将被执行,然后才是finally,对吗?请参考:stackoverflow.com/questions/3109353/…
在finally块之后写上return getResponse();
如何?这样无论是否捕获到异常,您的方法都会返回一个值。
.O.Balance谢谢,我完全忘记在finally块之后放置一个return语句。