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