Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这个程序不能正常运行?_Java_Stack - Fatal编程技术网

Java 为什么这个程序不能正常运行?

Java 为什么这个程序不能正常运行?,java,stack,Java,Stack,任务是使用堆栈创建后缀到中缀的转换器。该程序编译正确,但当我试图制作一个演示类时,我收到一个空点异常第32行。请分享任何观察结果、更好的编码约定或解决方案 import java.util.Stack; public class PostfixtoInfix { private String expression; private Stack<Character> s; Character pOpen = new Character('('); Ch

任务是使用堆栈创建后缀到中缀的转换器。该程序编译正确,但当我试图制作一个演示类时,我收到一个空点异常第32行。请分享任何观察结果、更好的编码约定或解决方案

import java.util.Stack;

public class PostfixtoInfix {
    private String expression;
    private Stack<Character> s;
    Character pOpen = new Character('(');
    Character pClose = new Character(')');

    public String PostfixtoInfix(String e) {
        expression = e;
        String output = "";
        for (int i = 0; i < e.length(); i++) {
            char currentChar = e.charAt(i);
            if (isOperator(currentChar)) {
                while (!s.empty() && s.peek() != pOpen
                        && hasHigherPrecedence(s.peek(), currentChar)) {
                    output += s.peek();
                    s.pop();
                }
                s.push(currentChar);
            } else if (isOperand(currentChar)) {
                output += currentChar;
            } else if (currentChar == '(') {
                s.push(currentChar);
            } else if (currentChar == ')') {
                while (!s.empty() && s.peek() != pClose) {
                    output += s.peek();
                    s.pop();
                }
            }
            while (!s.empty()) {
                output += s.peek();
                s.pop();
            }
        }
        return output;
    }

    public boolean isOperator(char c) {
        if (c == '+' || c == '-' || c == '/' || c == '*' || c == '^')
            return true;
        return false;
    }

    public boolean isOperand(char c) {
        if (c >= '0' && c <= '9')
            return true;
        if (c >= 'a' && c <= 'z')
            return true;
        if (c >= 'A' && c <= 'Z')
            return true;
        return false;
    }

    public int getOperatorWeight(char operator) {
        int weight = -1;
        switch (operator) {
        case '+':
        case '-':
            weight = 1;
            break;

        case '*':
        case '/':
            weight = 2;
            break;

        case '^':
            weight = 3;
        }
        return weight;
    }

    public boolean hasHigherPrecedence(char operator1, char operator2) {
        int op1 = getOperatorWeight(operator1);
        int op2 = getOperatorWeight(operator2);
        if (op1 == op2) {
            if (isRightAssociative(operator1))
                return false;
            else
                return true;
        }
        return op1 > op2 ? true : false;
    }

    public boolean isRightAssociative(char op) {
        if (op == '^')
            return true;
        return false;
    }
}

您的访问修饰符可能阻止程序访问堆栈。 更改:

致:


阅读更多内容

似乎您声明了一个私有成员s,从未向其分配任何内容,然后尝试在s.empty和s.pop之类的表达式中使用它。如果没有为s分配任何内容,则它为null,并且尝试对其调用方法将导致NullPointerException

要创建空堆栈,可能需要将声明更改为:

private Stack <Character> s = new Stack<Character>();
要修复NPE,请初始化对象。与C++不同,堆栈S;等价于堆栈s=null;;不堆叠s=新堆叠

小心==和!=与装箱对象的预期行为不同

给出正确的答案!回答错误

它们是不同的对象。如果要比较是否相等,请使用以下任一选项:

System.out.println(a.equals(aa));
System.out.println((char)a==(char)aa);

第一种方法使用显式方法比较对象内容。第二种方法通过使用非对象原语来避免此问题,其中相等是按位的,而不是引用相等。

首先,您有一个看起来像构造函数的方法:

public String PostfixtoInfix(String e) {
尝试将其更改为其他内容,例如:

public String transform(String e) {
其次,您的s字段从未被分配堆栈。放

s = new Stack<Character>();

在构造函数中。还有,新角色“a”!=新角色“a”,因为这将绕过自动枕重缓存装箱。只使用简单的字符,如pOpen和pClose。

不知道任何会导致NullPointerException的方法。应该会导致编译器错误。建议?学习使用你的调试器和谷歌。我投票决定关闭,因为寻求调试帮助的问题为什么这段代码不起作用?必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。
public String PostfixtoInfix(String e) {
public String transform(String e) {
s = new Stack<Character>();