繁体   English   中英

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

[英]Null pointer exception when trying to create table in sqlite database with Java

我有一个简单的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)

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

提示:异常包含5个有用的东西:类型,消息,堆栈跟踪和因果链。 打印所有困难的事情; 所以不要尝试 如果您不知道如何处理异常,则可以将其向前抛出(在此处throws Exception您的main方法上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现在将打印所有相关信息,而不仅仅是点点滴滴。 另外,如果发生异常,则导致异常的代码路径将中止,而不是继续在无效状态下继续。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM