ошибка: на нестатический метод нельзя ссылаться из статического контекста

Да, я знаю, что эта ошибка встречается чаще, чем обычный грипп, и нет, я понятия не имею, как ее исправить. Потому что, честно говоря, я понятия не имею, что это значит в данном конкретном случае. У меня есть очень простой код для проверки скобок, но он не компилируется из-за этого, и я не уверен, почему.

Ошибка в тестовом классе, строка 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);
}
 }

person user3236502    schedule 25.03.2014    source источник
comment
Поверните голову вправо и загляните в раздел Related.   -  person Sotirios Delimanolis    schedule 25.03.2014
comment
Если бы это помогло, я бы так и сделал, но это только больше меня смущает.   -  person user3236502    schedule 25.03.2014
comment
Тогда ничего из того, что здесь написано, не поможет.   -  person Sotirios Delimanolis    schedule 25.03.2014
comment
Итак, да, я только что посмотрел, до сих пор не знаю, как решить мою проблему, я не могу сделать ее статической, потому что тогда я получаю другие ошибки.   -  person user3236502    schedule 25.03.2014


Ответы (2)


Посмотрите на эти строки в вашем примере:

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

Первая строка создает объект. Он использует класс Arithmetic и вызывает конструктор, принимающий строку. Затем, поскольку ни одной переменной не присваивается результат, новый объект отбрасывается.

Вторая строка пытается вызвать isBalanced. Но (поскольку он не объявлен с static) isBalanced является методом экземпляра, что означает, что его нужно вызывать в экземпляре Arithmetic. Вы создали объект, который вы могли бы вызвать isBalanced в предыдущей строке, вам просто нужно сохранить ссылку на него и использовать эту ссылку.

Назначьте новый объект переменной:

Arithmetic a = new Arithmetic(s);
boolean balanced = a.isBalanced();
person Nathan Hughes    schedule 25.03.2014
comment
Спасибо!!! Смотрите, это то, что мне было нужно, я понятия не имел, что выбрасываю объект. - person user3236502; 25.03.2014
comment
Я сделаю это через минуту, когда это позволит мне сделать это. - person user3236502; 25.03.2014
comment
Кстати, спасибо за объяснение, почему это не сработало. - person user3236502; 25.03.2014

Проблема в том, что вы вызываете isBalanced для класса Arithmetic, а не для экземпляра.

Следующее должно решить проблему:

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

В качестве примечания: Boolean — это имя класса, который содержит значение boolean.

person Abrixas2    schedule 25.03.2014