在java中对象可以声明为静态的吗?
上面是我的代码片段。我将在java中对象可以声明为静态的吗?,java,jakarta-ee,jdbc,Java,Jakarta Ee,Jdbc,上面是我的代码片段。我将连接和结果集对象声明为静态对象,以便可以从静态验证器方法调用它们。 此外,verificator方法被声明为静态的,这样就可以通过使用className.verificator(param,param)从另一个类作为类变量调用它 当我单独测试类时,它会编译并运行,但当从不同的类调用时,我会在PerparedStatement行中得到NullPointerException错误 有人能帮我解释一下为什么会这样吗 谢谢您将得到一个空点异常,因为您没有初始化变量。试试像这样的东
连接
和结果集
对象声明为静态对象,以便可以从静态验证器方法调用它们。
此外,verificator方法被声明为静态的,这样就可以通过使用className.verificator(param,param)从另一个类作为类变量调用它
当我单独测试类时,它会编译并运行,但当从不同的类调用时,我会在PerparedStatement行中得到NullPointerException错误
有人能帮我解释一下为什么会这样吗
谢谢您将得到一个
空点异常
,因为您没有初始化变量。试试像这样的东西
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='?'");
或者在访问变量之前运行初始化变量的函数。您会得到一个
NullPointerException
,因为您没有初始化变量。试试像这样的东西
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
,而应该使它们基于实例,并从静态方法调用该实例。这意味着您的连接
对象在某个地方被关闭或没有正确初始化(通过调用构造函数)。我强烈建议不要使用诸如Connection
和ResultSet
之类的静态资源,而是让它们基于实例,并从静态方法调用该实例。您说过您将验证器方法声明为静态,以便可以从其他类访问它,而验证器方法正在使用连接,这也是静态的
问题是连接仅在对象的构造函数中初始化,因此,如果从未调用构造函数,则connect将为null
您需要在静态块中初始化connect变量,或者在使用它之前验证它是否为null。您说过您将verificator方法声明为静态,因此可以从其他类访问它,并且verificator方法正在使用连接,该连接也是静态的 问题是连接仅在对象的构造函数中初始化,因此,如果从未调用构造函数,则connect将为null
您需要在静态块中初始化connect变量,或者在使用它之前验证它是否为null。当类的实例被构造时,即当您使用
new
关键字时,将执行构造函数。在创建ServerFunctions
实例之前,使用静态connect
变量,构造函数不会执行
您可以使用静态初始值设定项块来纠正这一点,这将在加载类时执行
public static ResultSet resultSet = new ResultSet();
构造函数是在类的实例被构造时执行的,也就是当您使用
new
关键字时。在创建ServerFunctions
实例之前,使用静态connect
变量,构造函数不会执行
您可以使用静态初始值设定项块来纠正这一点,这将在加载类时执行
public static ResultSet resultSet = new ResultSet();
在java中对象可以声明为静态的吗
你可以,但这不是个好主意
static{
//code from your constructor here
}
在java中对象可以声明为静态的吗
你可以,但这不是个好主意
static{
//code from your constructor here
}
嗯。。。谢谢你。我得到了它。当从另一个类调用时,它从未被初始化。在StackOverflow中,没有什么比接受正确答案更能表达“谢谢”的了。不客气嗯。。。谢谢你。我得到了它。当从另一个类调用时,它从未被初始化。在StackOverflow中,没有什么比接受正确答案更能表达“谢谢”的了。不客气一些注释:如果您使用的是预先准备好的语句,则不需要将字符串参数括在引号中。您可以从username=?&&密码=?。如果你真的想做用户验证,那么首先要知道你做错了,网上有很多参考资料可以帮助你(比如)。另外,你没有使一个“对象”成为静态的,你是在使你对该对象的引用成为静态的——不管你如何引用它,对象本身都是存在的。明白了:)我纠正了这一点:)Thanx一些注释:如果你使用的是预处理语句,你不需要用引号括住字符串参数。您可以从username=?&&密码=?。如果你真的想做用户验证,那么首先要知道你做错了,网上有很多参考资料可以帮助你(比如)。另外,你没有使一个“对象”成为静态的,你是在使你对那个对象的引用成为静态的——不管你如何引用它,对象本身都是存在的