0

你好,我有一个函数,它在 (.) 和字符串中的“Vl”之后取数字,所以我想在代码上调用这个函数,但他们告诉我这个错误

non-static method Ajuster(String) cannot be referenced from a static context

这是代码

public class Test {
     public Integer Ajuster(String data) { 
        Integer vlan=0;

        if (data.indexOf("Vl") >= 0) {
            int pos = data.indexOf("Vl") + 2;
            String vl = data.substring(pos, data.length());
            vlan=Integer.parseInt(vl.trim());           
        } else {
            int pos = data.lastIndexOf(".") + 1;
            String vl = data.substring(pos, data.length());
            try {
               vlan=Integer.parseInt(vl.trim()); 

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return vlan;
    }

    public static void main(String[] args) {

       Connection conn = null;
       try { 
          conn = DriverManager.getConnection("jdbc:mysql://localhost/mohammedia", "root", "123456"); 
          String sql = "SELECT * FROM router;"; 
          Telnet_Interface telnet = new Telnet_Interface();
          Telnet_Ressources telnet_R = new Telnet_Ressources();
          Telnet_Interface telnet1 = new Telnet_Interface();
          Telnet_Interface telnet2 = new Telnet_Interface();
          PreparedStatement prest = conn.prepareStatement(sql);
          ResultSet res=prest.executeQuery();
          while(res.next()){
             telnet1.Config(res.getString(1), "noc", "nocwana", res.getString(1));
             telnet2.Config(res.getString(2), "noc", "nocwana", res.getString(2));
          }
          ArrayList myData=telnet.getMyData();
          ArrayList myData1=telnet1.getMyData();
          ArrayList myData2=telnet2.getMyData();

          for(int i=0;i<myData1.size();i++)    
          {
             String data1=myData1.get(i).toString();
             Integer vl1=Ajuster(data1);
             System.out.print(vl1);
          }
       } 

}

所以问题在于这条线: Integer vl1=Ajuster(data1); 谢谢

4

5 回答 5

0

看来您正在public Integer Ajuster(String data)从实际上是静态的 main 调用非静态方法。为了调用该方法,Ajuster您必须实例化 Test 类的一个对象。我想你知道怎么做,但是你必须把它写下来Test test = new Test()

于 2013-06-14T10:02:04.983 回答
0

mainstatic。这意味着它与Test类的实例无关,而是与类本身相关。

Ajuster(请遵循 Java 编码指南,应该是ajuster)不是静态的,因此它与Test. 因此,要使用它,您必须从创建的实例中使用它(像这样)

Test test = new Test();
test.ajuster();

或成功static(尽量不要过度使用static方法)

于 2013-06-14T10:00:36.023 回答
0

不创建对象就不能调用非静态方法。如果它是一个非静态上下文,那么当前对象 ( this) 将在那里。如果来自静态方法,则必须创建一个对象并在该对象上调用该方法。

每个对象的静态方法都是相同的。在那种情况下,我们无法知道object我们在应用方法或访问变量,这就是存在限制的原因。

或者,您可以将方法设为静态。但这取决于。您应该知道何时使用静态方法以及何时不使用。这是一个设计问题。

读:

了解静态方法和非静态方法的区别

什么时候方法应该是静态的

如何从 main 调用非静态方法

因此,创建一个对象并调用该方法:

                   Test newTest = new Test();
                   newTest.ajuster();
于 2013-06-14T10:04:58.540 回答
0

您不能在没有任何对象引用的情况下调用非静态对象。
要么使方法静态(取决于它是否不涉及任何实例变量)

 public static Integer Ajuster(String data)  

Test或使用类对象调用

Test obj = new Test();
obj.Ajuster("data");

或者更好的http://docs.oracle.com/javase/tutorial/

PS:以大写名称开头的方法看起来很奇怪

于 2013-06-14T09:59:12.017 回答
0

您必须了解非静态上下文不能在静态上下文中引用

public int test = 0;

public static void main(String[] args) {
  test += 4; //this wont compile
}

然而,非静态上下文可以包括非静态和静态上下文。尝试这样的事情。

public class Test {

public int test = 0;

  public static void main(String[] args) {
    new Test();
  }
  public Test() {
    test += 4; //this will compile
  }
}

如果你看不懂这个,试着去搜索了解一下Constructor

于 2013-06-14T10:33:43.173 回答