Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java:无法从静态上下文错误引用非静态变量_Java_Jtds - Fatal编程技术网

java:无法从静态上下文错误引用非静态变量

java:无法从静态上下文错误引用非静态变量,java,jtds,Java,Jtds,下面的代码正在变量con2上生成错误,表示无法从静态上下文错误引用非静态变量con2。“我在谷歌上搜索解决方案,他们建议该变量尚未初始化以使方法可用。我是否初始化错误?我也试着把事情公之于众,但也没用 import java.io.*; import java.net.*; import java.sql.*; import java.sql.CallableStatement; import java.sql.ResultSet; import java.sql.PreparedStatem

下面的代码正在变量
con2
上生成错误,表示
无法从静态上下文错误引用非静态变量con2。“
我在谷歌上搜索解决方案,他们建议该变量尚未初始化以使方法可用。我是否初始化错误?我也试着把事情公之于众,但也没用

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 

不,实际上,您必须将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());
 }
main()方法是静态的,但它引用了两个非静态成员:con2和getConnectionUrl2()。您需要做以下三件事之一:

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

2) 在main()内部,创建类testconnect的实例,并从中访问con2和getConnectionUrl2()

3) 分离出另一个类来保存con2和getConnectionUrl2(),以便testconnect中只有main。它仍然需要实例化不同的类并取消该类的方法

方案3是最佳方案#1是最糟糕的

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

您可能希望在con2的声明中添加“static”

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


“静态”的东西一直存在。其他的东西只有在你创建了一个对象之后才存在,甚至每个单独的对象都有它自己的副本。在这种情况下,这一点的另一面是关键:静态内容无法访问非静态内容,因为它不知道要查看哪个对象。如果您向其传递对象引用,它可以执行类似“thingie.con2”的操作,但不允许简单地说“con2”,因为您还没有说哪个对象的con2是什么意思。

最简单的更改如下:

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

Java有两种变量

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

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

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

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

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

现在,您要调用一个对象varibale:对象在哪里


您必须创建一个对象,然后只有您才能访问对象级别的变量。

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

静态变量是一个非常糟糕的主意(静态实数常量很好)。。。它将首先说明为什么会发生这个问题。