2012-08-03 70 views
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='?'"); 

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

它编译和运行,当我单独测试类,但然后我得到的PerparedStatement行时,每当有不同的类的调用时出现NullPointerException错误。

是否有人请帮助我为什么它发生?

三江源

+2

一些注释:如果您使用的是准备好的语句,则不需要将字符串参数括在引号中。你可以改用'Select * from username where username =? &&密码=?'。如果你认真对待用户验证,那么首先要知道你做错了,并且有许多在线帮助参考(例如http://crackstation.net/hashing-security.htm)。另外,您不要将“对象”设置为静态,而是将该对象的_reference_设置为静态 - 对象本身的生命不管您如何引用它。 – kbolino 2012-08-03 13:23:23

+0

让你:)我纠正了那些东西:) thanx – 2012-09-09 13:45:49

回答

9

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

问题是连接只是在对象的构造函数中初始化的,所以如果构造函数永远不会被调用,连接将是空的。

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

+0

uhmmm ...谢谢。我知道了。从另一个班级调用时,它永远不会被初始化。 谢谢丢失的Sir – 2012-08-03 13:20:01

+0

没有什么比在StackOverflow中说“谢谢”接受正确的答案。不客气。 =) – pcalcao 2012-08-03 16:30:25

1

你得到了NullPointerException,因为你不初始化变量。尝试类似

public static ResultSet resultSet = new ResultSet(); 

或之前运行功能至极初始化变量访问它们。

1

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

1

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

你可以使用一个静态初始化块来纠正这个问题,当这个类被加载的时候会被执行。

static{ 
    //code from your constructor here 
} 
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(
相关问题