1
public static Connection connect;
    public static ResultSet resultSet;
    static final String DATABASE_URL = "jdbc:mysql://localhost/java_dev";

    public ServerFunctions() {
        String Driver = "com.mysql.jdbc.Driver";            
        String DB_USERNAME = "lucky";
        String DB_PASSWORD = "lucky";

        try {
            Class.forName(Driver);
            connect = DriverManager.getConnection(DATABASE_URL,DB_USERNAME, DB_PASSWORD);
        } catch(Exception e) {
            System.out.println("Database Not Connected ! ");
        }
    }

    public static Boolean verificator(String username, String password) {
        try {
            PreparedStatement prepare = connect.prepareStatement(
                "Select * from users where username='?'&&password='?'");

以上是我的代码片段。我将ConnectionandResultset对象声明为静态的,以便可以从静态验证器方法中调用它们。验证器方法也被声明为静态的,因此可以通过使用 className.verificator(param, param) 从不同的类作为类变量调用它。

当我单独测试该类时,它会编译并运行,但是每当从不同的类进行调用时,我都会在 PerparedStatement Line 处收到 NullPointerException 错误。

有人可以帮我为什么会这样吗?

谢谢

4

5 回答 5

9

您说您将验证器方法声明为静态,因此可以从其他类访问它,并且验证器方法正在使用连接,这也是静态的。

问题是连接只在对象的构造函数中初始化,所以,如果构造函数从未被调用,connect 将为空。

您需要在静态块中初始化连接变量,或者在使用它之前验证它是否为空。

于 2012-08-03T13:18:06.307 回答
2

对象可以在java中声明为静态的吗?

你可以,但这是个坏主意。

public static Boolean verificator(String username, String password) {
    try {
        synchronized(DATABASE_URL){
            if(connect==null){
                Class.forName(Driver);
                connect = DriverManager.getConnection(DATABASE_URL,DB_USERNAME, DB_PASSWORD);
            }
        }

        PreparedStatement prepare = connect.prepareStatement(
于 2012-08-11T08:48:29.803 回答
1

你得到 aNullPointerException因为你没有初始化变量。尝试类似的东西

public static ResultSet resultSet = new ResultSet();

或运行在访问变量之前初始化变量的函数。

于 2012-08-03T13:16:57.470 回答
1

这意味着您的Connection对象在某处关闭或未正确初始化(通过调用构造函数)。我强烈建议不要使用 and 等静态资源ConnectionResultSet而是让它们基于实例并从静态方法调用该实例。

于 2012-08-03T13:17:53.397 回答
1

构造函数在类的实例被构造时执行,也就是当你使用new关键字时。connect在创建构造函数实例之前使用静态变量ServerFunctions不会被执行。

您可以使用静态初始化程序块来纠正此问题,该程序将在加载类时执行。

static{
    //code from your constructor here
}
于 2012-08-03T13:19:47.210 回答