![](/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.