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

时间:2012-08-03 13:13:50

标签: java java-ee jdbc

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='?'");

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

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

有人可以帮我解释为什么会发生这种情况吗?

三江源

5 个答案:

答案 0 :(得分:9)

你说你将verificator方法声明为static,所以可以从其他类访问它,而verificator方法也使用连接,这也是静态的。

问题是连接只在对象的构造函数中初始化,因此,如果从不调用构造函数,connect将为null。

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

答案 1 :(得分: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(

答案 2 :(得分:1)

您获得NullPointerException,因为您没有初始化变量。尝试像

这样的东西
public static ResultSet resultSet = new ResultSet();

或运行函数,在强访问之前初始化变量

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

static{
    //code from your constructor here
}