You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

括号平衡实验项目: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 Expressions
  • the method peek() is undefined for the type Expressions
  • The method isEmpty() is undefined for the type Expressions
  • The method pop() is undefined for the type Expressions

报错原因

  1. 方法调用对象错误:push、peek、isEmpty、pop是RStack类的成员方法,你直接在Expressions类中调用这些方法,但Expressions本身并没有定义这些方法,必须通过类中声明的RStack类型成员变量data来调用。
  2. 栈对象未初始化:构造函数Expressions()中没有对data进行初始化,导致data为null,即使修正方法调用方式,后续也会触发空指针异常。
  3. 未声明变量使用: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:50:26