statement.executeQuery()的奥秘。代码未被执行,也没有捕获到异常。

9 浏览
0 Comments

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------------------------------------

0
0 Comments

问题出现的原因是代码中存在语法错误,导致代码没有被执行,也没有捕获到异常。具体来说,代码中的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驱动程序,代码应该可以正常执行。

0
0 Comments

当异常被抛出时,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语句。

0