【问题标题】:error: non-static method cannot be referenced from a static context [duplicate]错误:不能从静态上下文中引用非静态方法[重复]
【发布时间】:2014-05-03 14:00:44
【问题描述】:

是的,我知道这个错误比普通流感更常见,不,我不知道如何解决它。因为坦率地说,我不知道它在这个特定实例上意味着什么。我有非常简单的代码来检查括号,但是由于这个原因它没有编译,我不知道为什么。

错误在测试类,第 14 行。

但这是我唯一的两门课。

import java.util.Stack;
import java.util.EmptyStackException;

class Arithmetic
{

Stack <Object>stk;
String expression;
int length;

Arithmetic(String s) 
{
expression = s;
length = expression.length();
stk = new Stack<Object>();
}

boolean isBalanced()
{
int index = 0;
boolean fail = false;

try
  {
  while(index < length)
  {
  char ch = expression.charAt(index);

  switch(ch)
        {
        case '(':
                 stk.push(ch);
        break;

        case ')':
                 stk.pop();   
        break;

        default:
                 //ignore all others chars.
        break;               
        }
        index++; //increment index to continue on to the next char.
  }           

  }
  catch(EmptyStackException e)
  {
     fail = true;
  }
  return fail;
}


}

有错误的那个:

 import javax.swing.JOptionPane;
 import javax.swing.JTextArea;

 class TestFile
 {
public static void main(String[] arg)
{

  String menu = "Please enter an arithmetic expression to evaluate for balance:";
  String s = JOptionPane.showInputDialog( menu);   
  display(s);

  new Arithmetic(s);
  boolean balanced = Arithmetic.isBalanced();

  display(balanced);


  }
  static void display(boolean Boolean)
{
    JOptionPane.showMessageDialog(null, Boolean, "Content",      JOptionPane.INFORMATION_MESSAGE);
}



static void display(String s)
{
    JOptionPane.showMessageDialog(null, s, "Content", JOptionPane.INFORMATION_MESSAGE);
}
 }

【问题讨论】:

  • 将头向右转,查看Related 部分下方。
  • 如果有帮助,我会这样做,但这只会让我更加困惑。
  • 那么任何人在这里发帖都无济于事。
  • 所以是的,我只是看了看,仍然不知道如何解决我的问题,我无法将其设为静态,因为那时我会遇到其他错误。

标签: java static stack non-static static-content


【解决方案1】:

看看你的例子中的这些行:

new Arithmetic(s);
boolean balanced = Arithmetic.isBalanced();

第一行创建一个对象。它使用 Arithmetic 类并调用接受字符串的构造函数。然后,由于没有为变量分配结果,因此新对象被丢弃。

第二行尝试调用 isBalanced。但是(因为它没有用static 声明)isBalanced 是一个实例方法,这意味着它需要在算术实例上调用。您在上一行中创建了一个可以调用 isBalanced 的对象,您只需要保留对它的引用并使用该引用。

将新对象赋值给一个变量:

Arithmetic a = new Arithmetic(s);
boolean balanced = a.isBalanced();

【讨论】:

  • 谢谢!!!看看这就是我需要的,我不知道我正在扔掉这个物体。
  • 我会在允许的情况下在一分钟内这样做。
  • 顺便说一句,感谢您解释为什么它不起作用。
【解决方案2】:

问题是您在 Arithmetic 类上调用 isBalanced,而不是在实例上。

以下应该可以解决问题:

Arithmetic a = new Arithmetic(s);
a.isBalanced();

附带说明:Boolean 是一个包含 boolean 值的类的名称。

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 2011-06-22
    • 2023-03-22
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    相关资源
    最近更新 更多