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

时间:2019-06-22 04:29:10

标签: java sql database sqlite

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

  • 我确保所有需要的罐子都在那里。
  • 我使用调试器查找有问题的代码行。这是我的代码的第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)

1 个答案:

答案 0 :(得分:1)

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

提示:异常包含5个有用的东西:类型,消息,堆栈跟踪和因果链。打印所有困难的事情;所以不要尝试如果您不知道如何处理异常,则可以将其向前抛出(只需在此处将throws Exception放在您的主要方法上),或者如果您不希望这样做,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”(自动资源管理)构造来创建连接和语句对象,确保无论块如何退出,它们始终在关闭时关闭。

  2. 该代码更短,更易于阅读。

  3. 发生的SQLExceptions现在将打印所有相关信息,而不仅仅是点点滴滴。另外,如果发生异常,则导致异常的代码路径将中止,而不是继续以无效状态继续。