【问题标题】:How to fix this NullPointerException on executeQuery?如何在 executeQuery 上修复此 NullPointerException?
【发布时间】:2019-10-13 05:13:49
【问题描述】:

我的简单 sql 语句的 executeQuery 出现 NullPointerException;我认为问题来自与 sqlite 的连接,但我无法弄清楚......

我的java方法:

    public Connection connect() throws SQLException {
    Connection conn = null;
    try {
        try {
            Class.forName("org.sqlite.JDBC");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        String url = "jdbc:sqlite:sakila.db.sqlite3";
        conn = DriverManager.getConnection(url);
        System.out.println("Connection to SQLite has been established.");
    } catch (SQLException e) {  
        System.out.println(e.getMessage());  
    }

    Statement stmt = conn.createStatement();        
    String sql = "SELECT * FROM FILM LIMIT 10";
    stmt.executeQuery(sql);
    return conn;
}

这是控制台的结果

Connection to SQLite has been established.
Exception in thread "main" java.lang.NullPointerException
at org.sqlite.Stmt.executeQuery(Stmt.java:121)
at Connect.connect(Connect.java:33)
at Main.main(Main.java:10)

提前致谢

【问题讨论】:

  • Hrmm... 你试过调试吗?大多数时候,对于这种类型的错误,人们通过调试发现它。附带说明一下,您似乎没有在 catch 块中处理 NullPointerException 异常。在需要的地方为其添加一个 catch 块。
  • @Sometowngeek 您通常不应该捕获NullPointerException,因为它通常表明您的代码中存在错误。
  • @MarkRotteveel 我认为 Exception e 是您要避免的。
  • @Sometowngeek NullPointerExceptions 通常表示需要修复的错误,捕获它们会忽略这些问题,应该避免。不要捕获 NullPointerException,而是修复根本原因。

标签: java sqlite jdbc


【解决方案1】:

看起来您正在使用它之前关闭连接。尝试在try-catch中移动statement + executeQuery

【讨论】:

  • 这似乎是 sqlite Statement 实现中的一个错误。像这样的情况应该抛出带有“连接已关闭”(或statement is closed 或类似)消息的SQLException
【解决方案2】:

你的finally块,关闭连接,所以当语句

Statement stmt = conn.createStatement(); 

到达时,它会抛出 NullPointerException。要解决此问题,您的代码应如下所示:

public Connection connect() throws SQLException {

        Connection conn = null;
        try {
            try {
                Class.forName("org.sqlite.JDBC");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            String url = "jdbc:sqlite:sakila.db.sqlite3";
            conn = DriverManager.getConnection(url);
            System.out.println("Connection to SQLite has been established.");
            Statement stmt = conn.createStatement();        
            String sql = "SELECT * FROM FILM LIMIT 10";
            stmt.executeQuery(sql);
            return conn;
        } catch (SQLException e) {  
            System.out.println(e.getMessage());  
        } finally {  
            try {  
                if (conn != null) {  
                    conn.close();  
                }  
            } catch (SQLException ex) {  
                System.out.println(ex.getMessage());  
            }  
        }
    }

【讨论】:

    猜你喜欢
    • 2019-01-05
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2020-11-26
    • 1970-01-01
    相关资源
    最近更新 更多