我有一个简单的 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);
}
}
}
注意上面的示例:
使用“ARM”(自动资源管理)构造来创建连接和语句对象,确保它们在 block 退出时始终关闭,无论它如何退出。
代码更短且更易于阅读。
确实发生的 SQLException 现在将打印所有相关信息,而不仅仅是零散的信息。此外,如果发生异常,导致异常的代码路径将中止,而不是在无效状态下继续前进。
关于java - 尝试使用 Java 在 sqlite 数据库中创建表时出现空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56712586/