我有一个简单的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)
答案 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);
}
}
}
请注意上面的示例:
使用“ ARM”(自动资源管理)构造来创建连接和语句对象,确保无论块如何退出,它们始终在关闭时关闭。
该代码更短,更易于阅读。
发生的SQLExceptions现在将打印所有相关信息,而不仅仅是点点滴滴。另外,如果发生异常,则导致异常的代码路径将中止,而不是继续以无效状态继续。