![](/img/trans.png)
[英]Java/JavaMail: Null pointer exception when trying to create a folder to fetch E-Mails (GMAIL/POP3)
[英]Null pointer exception when trying to create table in sqlite database with Java
我有一個簡單的Java程序,它連接到一個空的sqlite數據庫。 我正在嘗試創建表,但是在嘗試執行查詢時出現空指針異常。
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);
}
}
}
請注意上面的示例:
使用“ ARM”(自動資源管理)構造來創建連接和語句對象,以確保無論塊如何退出,它們始終在關閉時關閉。
該代碼更短,更易於閱讀。
確實發生的SQLExceptions現在將打印所有相關信息,而不僅僅是點點滴滴。 另外,如果發生異常,則導致異常的代碼路徑將中止,而不是繼續在無效狀態下繼續。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.