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='?'");
上面是我的代码片段。我声明Connection
和Resultset
对象是静态的,因此可以从静态验证器方法调用它们。
同样,verificator方法被声明为static,因此可以通过使用className.verificator(param,param)从不同的类作为类变量调用它。
当我单独测试类时编译并运行,但是每当从不同的类调用时,我都会在PerparedStatement行中得到NullPointerException错误。
有人可以帮我解释为什么会发生这种情况吗?
三江源
答案 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
对象已在某处关闭或未正确初始化(通过调用构造函数)。我强烈建议不要使用Connection
和ResultSet
之类的静态资源,而应使它们基于实例,并从静态方法调用该实例。
答案 4 :(得分:1)
构造函数在构造类的实例时执行,即使用new
关键字时。通过在创建connect
实例之前使用静态ServerFunctions
变量,构造函数不会被执行。
您可以使用静态初始化程序块来纠正这个问题,这将在加载类时执行。
static{
//code from your constructor here
}