我知道这是一个狡猾的问题,但请让我知道为什么下面提到的代码抛出NullPointerException?初始化按下一个顺序执行:static fields / initializator - constructor - local variables。如果调用addInvoiceData()时所有静态变量(连接和语句)都已初始化,为什么会出现异常?如果我在方法中连接到DB,一切都会成功。任何意见将不胜感激。
public class DaoClass {
public DaoClass() {
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/ved_project", "root", "1111");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
static Connection connection;
static PreparedStatement statement;
public static void addInvoiceData() {
try {
statement = connection.prepareStatement("INSERT INTO invoices(contractor_id, invoice_num, date, amount) VALUES (?, ?, ?, ?)");
statement.setInt(1, 1);
statement.setString(2, "RM-2014");
statement.setString(3, "20140212");
statement.setFloat(4, 125.12f);
statement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (statement != null) {statement.close();}
if (connection != null) {connection.close();}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
addInvoiceData();
}
}
答案 0 :(得分:2)
因为在上面的代码中从不调用构造函数。要调用构造函数,需要
new DaoClass()
的某个地方。
请注意,从构造函数或实例方法初始化statis字段是错误的设计。静态字段属于该类。每次创建此类的实例时都会调用构造函数。每次调用构造函数时都没有理由重新初始化静态字段。
阅读http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html以更好地了解静态字段和方法。