括号平衡实验项目:Java Expressions类方法未定义报错求助
问题分析与解决
原始代码
import stack.RStack; public class Expressions { private RStack data; public Expressions() { } public boolean checkbalance(String expression) { char charAt; int i, len; len = expression.length(); for(i = 0; i < len; i++) { charAt = expression.charAt(i); if(charAt == '(') push(charAt); else if(ch == ')') { if(isEmpty()) return false; else if((char)peek() == '(') pop(); else return false; } } if(isEmpty()) return true; else return false; } public int precedence(char c) { if((c == '*') || (c == '/')) return 2; else if((c == '+') || (c == '-')) return 1; else return 0; } public boolean isOperand(char c) { if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')) return true; else return false; } public String infixToPostfix(String infix) { char c; int len, i; String postfix = ""; len = infix.length(); for(i = 0; i < len; i++) { c = infix.charAt(i); if(isOperand(c)) postfix = postfix + c; else if(c == '(') push(c); else if(c == ')') { while((char)peek() != '(') postfix = postfix + pop(); pop(); } else { while(!isEmpty() && (precedence(c) <= precedence((char)peek()))) postfix = postfix + pop(); push(c); } } while(!isEmpty()) postfix = postfix + pop(); return postfix; } public RStack getData() { return data; } public void setData(RStack data) { this.data = data; } }
报错信息
运行时出现以下报错:
The method push(char) is undefined for the type Expressionsthe method peek() is undefined for the type ExpressionsThe method isEmpty() is undefined for the type ExpressionsThe method pop() is undefined for the type Expressions
报错原因
- 方法调用对象错误:
push、peek、isEmpty、pop是RStack类的成员方法,你直接在Expressions类中调用这些方法,但Expressions本身并没有定义这些方法,必须通过类中声明的RStack类型成员变量data来调用。 - 栈对象未初始化:构造函数
Expressions()中没有对data进行初始化,导致data为null,即使修正方法调用方式,后续也会触发空指针异常。 - 未声明变量使用:
checkbalance方法中使用了未定义的变量ch,应该替换为当前循环中已声明的charAt变量。
修正后的代码
import stack.RStack; public class Expressions { private RStack data; // 初始化栈对象,避免空指针 public Expressions() { data = new RStack(); } public boolean checkbalance(String expression) { char charAt; int i, len; len = expression.length(); for(i = 0; i < len; i++) { charAt = expression.charAt(i); if(charAt == '(') data.push(charAt); // 通过data调用push方法 else if(charAt == ')') { // 修正未定义的ch变量 if(data.isEmpty()) // 通过data调用isEmpty方法 return false; else if((char)data.peek() == '(') // 通过data调用peek方法 data.pop(); // 通过data调用pop方法 else return false; } } return data.isEmpty(); // 简化返回逻辑 } public int precedence(char c) { if((c == '*') || (c == '/')) return 2; else if((c == '+') || (c == '-')) return 1; else return 0; } public boolean isOperand(char c) { if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')) return true; else return false; } public String infixToPostfix(String infix) { char c; int len, i; String postfix = ""; len = infix.length(); for(i = 0; i < len; i++) { c = infix.charAt(i); if(isOperand(c)) postfix = postfix + c; else if(c == '(') data.push(c); // 通过data调用push方法 else if(c == ')') { while((char)data.peek() != '(') // 通过data调用peek方法 postfix = postfix + data.pop(); // 通过data调用pop方法 data.pop(); // 通过data调用pop方法 } else { while(!data.isEmpty() && (precedence(c) <= precedence((char)data.peek()))) // 通过data调用isEmpty、peek方法 postfix = postfix + data.pop(); // 通过data调用pop方法 data.push(c); // 通过data调用push方法 } } while(!data.isEmpty()) // 通过data调用isEmpty方法 postfix = postfix + data.pop(); // 通过data调用pop方法 return postfix; } public RStack getData() { return data; } public void setData(RStack data) { this.data = data; } }
关键修改说明
- 在构造函数中初始化
data = new RStack();,解决空指针问题。 - 将所有栈操作方法的调用改为
data.方法名()的形式,明确调用RStack对象的方法。 - 修正
checkbalance方法中的未定义变量错误。 - 简化
checkbalance方法的返回逻辑,提升代码简洁性。
内容的提问来源于stack exchange,提问作者benc joseph
相关产品推荐
相关产品推荐

