8

次のコードは、解決策をGoogleで検索したというエラーを変数に生成して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 
4

6 に答える 6

13

con2の宣言に「static」を追加することをお勧めします。

Javaでは、モノ(変数とメソッドの両方)はクラスのプロパティ(つまり、そのタイプのすべてのオブジェクトによって共有される)にすることも、オブジェクトのプロパティ(同じクラスの各オブジェクトで異なるもの)にすることもできます。 )。キーワード「static」は、何かがクラスのプロパティであることを示すために使用されます。

「静的」なものは常に存在します。他のものは、オブジェクトを作成した後にのみ存在し、その場合でも、個々のオブジェクトにはそれぞれ独自のコピーがあります。この場合、これの裏側が重要です。静的なものは、調べるオブジェクトがわからないため、非静的なものにアクセスできません。オブジェクト参照を渡すと、「thingie」のようなことができます。 .con2 "ですが、どのオブジェクトのcon2が意味されているかを指定していないため、単に「con2」と言うことは許可されていません。

于 2009-05-29T16:17:58.387 に答える
10

いいえ、実際には、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());
 }
于 2009-05-29T16:11:49.883 に答える
6

Javaには2種類の変数があります

a)
クラスレベル(静的):クラス
ごとに1つです。StudentClassがあり、静的変数として名前が定義されているとします。これで、作成するStudentオブジェクトの数に関係なく、すべて同じ名前になります。

オブジェクトレベル:オブジェクト
ごとに属します。名前が静的でない場合、すべての生徒が異なる名前を持つことができます。

b)
クラスレベル:
この変数はクラスのロード時に初期化されるため、学生オブジェクトが作成されていない場合でも、静的な名前変数にアクセスして使用できます。

オブジェクトレベル:新しいオブジェクトを作成すると、たとえばnew()によって初期化されます。

C)
問題:クラスがJVMにロードされ、そのメイン(静的)メソッドを呼び出しました:法的に許可されています。

ここから、オブジェクト変数を呼び出します。オブジェクトはどこにありますか?

オブジェクトを作成する必要があります。そうすれば、オブジェクトレベルの変数にアクセスできるのは自分だけです。

于 2009-05-29T16:52:16.687 に答える
5

main()メソッドは静的ですが、2つの非静的メンバーcon2とgetConnectionUrl2()を参照しています。次の3つのいずれかを行う必要があります。

1)con2とgetConnectionUrl2()を静的にします。

2)main()内で、クラスtestconnectのインスタンスを作成し、そこからcon2とgetConnectionUrl2()にアクセスします。

3)con2とgetConnectionUrl2()を保持する別のクラスを分割して、testconnectにmainのみが含まれるようにします。それでも、別のクラスをインスタンス化し、それからメソッドを呼び出す必要があります。

オプション#3が最良のオプションです。#1は最悪です。

ただし、静的メソッド内から非静的メンバーにアクセスすることはできません。

于 2009-05-29T16:15:39.777 に答える
2

最も単純な変更は次のようになります。

public static void main (String[] args) throws Exception {
  testconnect obj = new testconnect();
  obj.con2 = DriverManager.getConnection(obj.getConnectionUrl2());
  obj.con2.close();
}
于 2009-05-29T16:37:48.497 に答える
0

これは興味深い質問です。もう少し情報を追加して、別の角度から説明したいと思います。静的メソッドがどのように動作するかを見ると、例外がスローされる理由を理解できます。これらのメソッドは、静的データ、ローカルデータ、またはパラメーターとして送信されるデータのいずれかを操作できます。なぜですか。静的メソッドは、どこからでも、どのオブジェクトからでもアクセスできるためです。そのため、インスタンス変数を使用できる場合、セキュリティの問題が発生したり、情報が漏洩したりする可能性があります。したがって、コンパイラはそのようなケースを考慮に入れずにスローする必要があります。

于 2011-12-05T17:29:38.110 に答える