java - 尝试使用 Java 在 sqlite 数据库中创建表时出现空指针异常

标签 java sql database sqlite

我有一个简单的 Java 程序,它连接到一个空的 sqlite 数据库。我正在尝试创建一个表,但是当我尝试执行查询时出现空指针异常。

  • 我确保所有必需的 jar 都在那里。
  • 我使用调试器找到了有问题的代码行。这是我下面代码的第 51 行。另一个相关的代码行是 Statement 类的第 113 行,如果需要,我可以将其发布以供引用。
  • 我确保我的声明已正确初始化
import java.sql.*;

public class SqliteConnection
{
    public static Connection connect()
    {
        Connection conn = null;
        try
        {
            // db parameters
            String url = "jdbc:sqlite:/database.db";
            // create a connection to the database
            conn = DriverManager.getConnection(url);

            System.out.println("Connection to SQLite has been established.");

        } 
        catch (SQLException e) 
        {
            System.out.println(e.getMessage());
        } 
        finally 
        {
            try
            {
                if (conn != null) 
                {
                    conn.close();
                }
            } 
            catch (SQLException ex) 
            {
                System.out.println(ex.getMessage());
            }
        }

        return conn;
    }

    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        Connection c = connect();

        try
        {
            //create the table
            Statement stmt = null;
            stmt = c.createStatement();
            String sql = "CREATE TABLE Car (CarID INT NOT NULL, Manufacturer TEXT, Type TEXT, FuelEfficiency REAL, PRIMARY KEY(CarID));";
            stmt.execute(sql);
            stmt.close();
            c.close();
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
}

堆栈跟踪:

java.lang.NullPointerException
    at org.sqlite.Stmt.execute(Stmt.java:113)
    at SqliteConnection.main(SqliteConnection.java:52)

最佳答案

您的 connect 方法创建一个连接对象,然后...立即自行关闭。这不是你使用 try/finally 的方式。 (最后意味着:在执行尝试退出关联的 try block 时执行此操作。这并不意味着:如果从现在开始整个代码库中的任何位置发生异常,则执行此 block )。

提示:异常包含 5 个有用的东西:类型、消息、堆栈跟踪和因果链。打印所有难以做到的事情;所以不要尝试。如果您不知道如何处理异常,可以直接抛出异常(只需将 throws Exception 放在您的 main 方法中),或者如果您不能/不希望这样做, throw new RuntimeException(e);e.printStackTrace() 相比,这是一种更优越的方法。

更好的实现示例:

import java.sql.*;

public class SqliteConnection {
    public static Connection connect() throws SQLException
    {
        Connection conn = DriverManager.getConnection(url);
        System.out.println("Connection to SQLite has been established.");
        return conn;
    }

    public static void main(String[] args) throws SQLException
    {
        try (Connection c = connect(); Statement stmt = c.createStatement();) {
            String sql = "CREATE TABLE Car (CarID INT NOT NULL, Manufacturer TEXT, Type TEXT, FuelEfficiency REAL, PRIMARY KEY(CarID));";
            stmt.execute(sql);
        }
    }
}

注意上面的示例:

  1. 使用“ARM”(自动资源管理)构造来创建连接和语句对象,确保它们在 block 退出时始终关闭,无论它如何退出。

  2. 代码更短且更易于阅读。

  3. 确实发生的 SQLException 现在将打印所有相关信息,而不仅仅是零散的信息。此外,如果发生异常,导致异常的代码路径将中止,而不是在无效状态下继续前进。

关于java - 尝试使用 Java 在 sqlite 数据库中创建表时出现空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56712586/

相关文章:

mysql - 如何设置具有类的三个实体之间的关系

java - 打开带有建议日期的 DatePicker

java - 使用 Java 14 的 WildFly 19.1 上的 ClassNotFoundException : java. security.acl.Group

sql - 无法使用 monotouch 连接到 sql azure 数据库

SQL - 按日期汇总事件(一次 5 天)

sql - 如何在 BigQuery 中扩展数据透视?

java - GWT 函数在 DatePicker 能够返回所选日期之前完成,如何延迟直到返回日期?

java - 库层次结构的 Maven 依赖问题

postgresql - 数据库分区的最佳大小

c# - 自动发送电子邮件