【问题标题】:java : non-static variable cannot be referenced from a static context Errorjava:无法从静态上下文错误中引用非静态变量
【发布时间】:2010-10-29 22:26:40
【问题描述】:

以下代码在变量con2 上生成错误,说"non-static variable con2 cannot be referenced from a static context Error." 我在谷歌上搜索了一个解决方案,他们建议该变量尚未初始化以使方法可用。我初始化不正确吗?我也尝试将内容更改为公开,但这也无济于事。

import java.io.*;
import java.net.*;

import java.sql.*;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import net.sourceforge.jtds.jdbcx.JtdsDataSource;
import net.sourceforge.jtds.jdbc.Driver;

class testconnect { 

     private java.sql.Connection con2 = null;

     private final String url2 = "jdbc:jtds:sqlserver://";
     private final String serverName= "SQL01";
     private final String portNumber = "2677";
     private final String databaseName= "App";
     private final String userName = "bob";
     private final String password = "boob";
     private final String selectMethod = "cursor";  

     private String getConnectionUrl2(){
        System.out.println("initalizing jtds");
          //String returnVal = url+serverName+":"+portNumber+";databaseName="+databaseName+";user="+userName+";password="+password+";instance="+instance+";";
          String returnVal = url2+serverName+":"+portNumber+"/"+databaseName+";user="+userName+";password="+password;
          System.out.println("url2: " + returnVal);
          return returnVal;
     }

     public static void main (String[] args) { 
         con2 = java.sql.DriverManager.getConnection(getConnectionUrl2());

     } 

} //end class 

【问题讨论】:

标签: java jtds


【解决方案1】:

这是一个有趣的问题,我只是想通过添加更多信息来提供另一个角度。如果您了解静态方法的操作方式,您就可以理解为什么会抛出异常。 这些方法可以操作静态数据、本地数据或作为参数发送给它的数据。为什么?因为静态方法可以被任何对象从任何地方访问。 因此,如果它可以使用实例变量,则可能存在安全问题或信息泄漏。因此编译器必须将这种情况排除在外。

【讨论】:

    【解决方案2】:

    Java 有两种变量

    一)
    类级别(静态):
    它们是每个班级一个。假设您有学生班级并将 name 定义为静态变量。现在无论您创建多少学生对象都将具有相同的名称。

    对象级别:
    它们属于每个对象。如果名称是非静态的,则所有学生都可以有不同的名称。

    b)
    班级等级:
    此变量在类加载时初始化。因此,即使没有创建学生对象,您仍然可以访问和使用静态名称变量。

    对象级别: 当你创建一个新对象时,它们将被初始化,比如 new();

    C)
    你的问题 : 您的类刚刚加载到 JVM 中,并且您调用了它的主要(静态)方法:合法允许。

    现在你想调用一个对象变量:对象在哪里??

    您必须创建一个对象,然后只有您可以访问对象级变量。

    【讨论】:

      【解决方案3】:

      最简单的改变是这样的:

      public static void main (String[] args) throws Exception {
        testconnect obj = new testconnect();
        obj.con2 = DriverManager.getConnection(obj.getConnectionUrl2());
        obj.con2.close();
      }
      

      【讨论】:

        【解决方案4】:

        您的 main() 方法是静态的,但它引用了两个非静态成员:con2 和 getConnectionUrl2()。您需要做以下三件事之一:

        1) 将 con2 和 getConnectionUrl2() 设为静态。

        2) 在 main() 内部,创建一个 testconnect 类的实例,并从中访问 c​​on2 和 getConnectionUrl2()。

        3) 拆分一个不同的类来保存 con2 和 getConnectionUrl2() 以便 testconnect 只有 main 。它仍然需要实例化不同的类并调用它的方法。

        选项#3 是最佳选项。 #1 是最差的。

        但是,您不能从静态方法中访问非静态成员。

        【讨论】:

          【解决方案5】:

          您可能希望在 con2 的声明中添加“静态”。

          在 Java 中,事物(变量和方法)可以是类的属性(这意味着它们被该类型的所有对象共享),也可以是对象的属性(每个对象中的一个不同的属性)同一班)。关键字“static”用于表示某些东西是类的属性。

          “静态”的东西一直存在。其他东西只有在你创建了一个对象之后才存在,即使这样,每个单独的对象也有它自己的副本。在这种情况下,这一点的另一面是关键:静态的东西不能访问非静态的东西,因为它不知道要查看哪个对象。如果你传递一个对象引用,它可以做类似“thingie”的事情.con2”,但是不能简单的说“con2”,因为你还没有说con2是指哪个对象。

          【讨论】:

          • 静态变量是一个非常糟糕的主意(静态实常数很好)。
          【解决方案6】:

          不,实际上,您必须将 con2 字段声明为静态:

          private static java.sql.Connection con2 = null;
          

          编辑:更正,实际上这还不够,您会遇到同样的问题,因为您的 getConnection2Url 方法也不是静态的。更好的解决方案可能是进行以下更改:

           public static void main (String[] args) { 
               new testconnect().run();
           } 
          
           public void run() {
               con2 = java.sql.DriverManager.getConnection(getConnectionUrl2());
           }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-01-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多