java: на нестатическую переменную нельзя ссылаться из статической контекстной ошибки

следующий код генерирует ошибку в переменной 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 

6 ответов


нет, на самом деле, вы должны объявить свое поле con2 статическим:

private static java.sql.Connection con2 = null;

Edit: исправление, этого на самом деле будет недостаточно, вы получите ту же проблему, потому что ваш метод getConnection2Url также не статичен. Лучшим решением может быть вместо этого сделать следующее изменение:

 public static void main (String[] args) { 
     new testconnect().run();
 } 

 public void run() {
     con2 = java.sql.DriverManager.getConnection(getConnectionUrl2());
 }

вероятно, вы хотите добавить "статический" в объявление con2.

в Java вещи (как переменные, так и методы) могут быть свойствами класса (что означает, что они разделяются всеми объектами этого типа), или они могут быть свойствами объекта (разные в каждом объекте того же класса). Ключевое слово "static" используется, чтобы указать, что нечто является свойством класса.

"статический" материал существует все время. Другие вещи существуют только после того, как вы создал объект, и даже тогда каждый отдельный объект имеет свою собственную копию вещи. И оборотная сторона этого является ключевой в этом случае: статический материал не может получить доступ к нестатическому материалу, потому что он не знает, в какой объект смотреть. Если вы ее передаете ссылку на объект, он может делать такие вещи, как "штучка.con2", но просто говорить "con2" не разрешается, потому что вы не сказали, Какой объект con2 подразумевается.


Java имеет два вида переменных

a)
Уровень Класса (Статический):
Они по одному на класс.Скажем, у вас есть класс Student и defined имя как статическая переменная.Теперь независимо от того, сколько студенческих объектов вы создаете, все они будут иметь одно и то же имя.

Уровень Объекта:
Они принадлежат каждому объекту.Если имя нестатическое, то все учащиеся могут иметь разные имена.

b)
Класс Уровень :
Этот переменные инициализируются при загрузке класса.Поэтому, даже если объект student не создан, вы все равно можете получить доступ и использовать статическую переменную имени.

уровни объекта: Они будут инициализированы при создании нового объекта, скажем new();

C)
твоя проблема : Ваш класс только что загружен в JVM, и вы вызвали его основной (статический) метод : юридически разрешено.

Теперь из этого вы хотите вызвать объект varibale : где находится объект ??

вы должны создать объект, а затем только вы можете получить доступ к varibales уровня объекта.


ваш метод main() является статическим, но он ссылается на два нестатических элемента: con2 и getConnectionUrl2(). Вам нужно сделать одну из трех вещей:

1) Сделайте con2 и getConnectionUrl2() статическими.

2) внутри main() создайте экземпляр класса testconnect и получите доступ к con2 и getConnectionUrl2 () от этого.

3) вырывается другой класс для удержания con2 и getConnectionUrl2 (), так что testconnect имеет только main в нем. Это все равно нужно будет создайте экземпляр другого класса и вызовите методы.

Вариант #3 является лучшим вариантом. #1-худшая.

но вы не можете получить доступ к нестатическим элементам из статического метода.


самым простым изменением было бы что-то вроде этого:

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

Это интересный вопрос, я просто хочу дать еще один угол, добавив немного больше информации.Вы можете понять, почему возникает исключение, если видите, как работают статические методы. Эти методы могут управлять статическими данными, локальными данными или данными, которые отправляются в него в качестве параметра.почему? потому что статический метод может быть доступен любому объекту, из любого места. Таким образом, могут возникнуть проблемы безопасности или утечки информации, если он может использовать переменные экземпляра.Следовательно, компилятор имеет выбросить такое дело из рассмотрения.