Compilerfehler
-
Hoi,
Ich hau schnell meine Hausaufgaben für die Uni raus und rätsle im Moment an 2 Compilerfehlern die ich nicht verstehe.Erstmal die Sourcefiles:
/** * GenericLinkedStack.java * xxxxxxxxxxx * A generic stack implementation. */ public class GenericLinkedStack<T> { class ListNode<T> { T value; ListNode<T> next; ListNode(T value, ListNode<T> next) { this.value = value; this.next = next; } } ListNode<T> m_anchor = null; int m_size = 0; public GenericLinkedStack() { } public void push(T obj) { m_anchor = new ListNode<T>(obj, m_anchor); ++m_size; } public T pop() { T obj = m_anchor.value; m_anchor = m_anchor.next; --m_size; return obj; } public int size() { return m_size; } public boolean isEmpty() { return m_size == 0; } }
/** * EvalArithmeticExpression.java * xxxxxxxxxxxxxxxx * Evaluates an arithmetic expression. */ public class EvalArithmeticExpression { public class SyntaxError extends Exception { } static boolean isNumeric(char value) { return (value >= '0' && value <= '9'); } static boolean isOperator(char value) { switch(value) { case '+': case '-': case '*': case '/': return true; default: return false; } } static boolean maySkip(char value) { switch(value) { case '(': case ' ': return true; default: return false; } } static void evaluateOnce(GenericLinkedStack<Character> operators, GenericLinkedStack<Integer> operands) { if(operators.size() * 2 != operands.size()) throw new SyntaxError("Stacksize mismatch."); int val2 = operands.pop(); int val1 = operands.pop(); char operator = operators.pop(); int result = 0; switch(operator) { case '+': result = val1 + val2; break; case '-': result = val1 - val2; break; case '*': result = val1 * val2; break; case '/': result = val1 / val2; break; } operands.push(new Integer(result)); } public static int eval(String s) throws SyntaxError { GenericLinkedStack<Character> operators; GenericLinkedStack<Integer> operands; for(int i = 0; i < s.length(); ++i) { char token = s.charAt(i); if(isOperator(token)) { operators.push(new Character(token)); } else if(isNumeric(token)) { String integer; integer += token; for(char digit = s.charAt(++i); isNumeric(digit) && i < s.length(); digit = s.charAt(++i)) { integer += digit; } operands.push(Integer.valueOf(integer)); --i; } else if(token == ')') { evaluateOnce(operators, operands); } else if(maySkip(token)) { // discard } else { throw new SyntaxError("Encountered invalid token: " + token); } } while(!operators.isEmpty()) evaluateOnce(); return operands.pop(); } }
Und das sind die Fehler, die der Compiler ausspuckt:
flo@ice:~/Uni/Algo_Dat/blaetter/blatt4$ javac -Xlint:unchecked *.java
EvalArithmeticExpression.java:49: non-static variable this cannot be referenced from a static context
throw new SyntaxError("Stacksize mismatch.");
^
EvalArithmeticExpression.java:114: non-static variable this cannot be referenced from a static context
throw new SyntaxError("Encountered invalid token: " + token);
^
EvalArithmeticExpression.java:119: evaluateOnce(GenericLinkedStack<java.lang.Character>,GenericLinkedStack<java.lang.Integer>) in EvalArithmeticExpression cannot be applied to ()
evaluateOnce();
^
3 errorsIch komme mir gerade richtig doof vor, hätte jemand die Güte mir zu erläutern was daran nicht passt? Danke
Grüße,
Flo
-
Die SyntaxError ist als "Instanzmember" in der Klasse EvalArithmeticExpression drin.
-
Ich hab SyntaxError mal frei in eine seperate Datei gepacktz, hilft auch nichts.
-
Das sollte aber helfen. Alternativ kannst du bei dem geposteten Code SyntaxError static deklarieren, also daraus eine statische innere Klasse machen. Nichtstatische innere Klassen ergeben in einem statischen Kontext nicht viel Sinn.