在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=?&&密码=?。如果你真的想做用户验证,那么首先要知道你做错了,网上有很多参考资料可以帮助你(比如)。另外,你没有使一个“对象”成为静态的,你是在使你对那个对象的引用成为静态的——不管你如何引用它,对象本身都是存在的