Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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_Constructor_Nullpointerexception_Stack - Fatal编程技术网

Java 在类调用期间获取空指针异常。可能的构造函数错误

Java 在类调用期间获取空指针异常。可能的构造函数错误,java,constructor,nullpointerexception,stack,Java,Constructor,Nullpointerexception,Stack,我正在编写一个程序,将中缀表达式作为字符串输入,并对其求值,结果返回一个double。然而,当我从main调用Calculator类时,我得到一个空指针异常。我的构造器中缺少了什么吗 这是我的主要类,从中调用计算器: import java.util.Scanner; public class Generator { public static Calculator calc; public Generator() { calc = new Calculator(); } publ

我正在编写一个程序,将中缀表达式作为字符串输入,并对其求值,结果返回一个double。然而,当我从main调用Calculator类时,我得到一个空指针异常。我的构造器中缺少了什么吗

这是我的主要类,从中调用计算器:

import java.util.Scanner;
public class Generator {

public static Calculator calc;

public Generator() {
    calc = new Calculator();
}

public static void main(String [] args) {
    Scanner scan = new Scanner(System.in);
    //calc = new Calculator();
    System.out.println("Enter the string you want to process");
    String equation = scan.nextLine();
    double result = calc.solve(equation);

    System.out.println("Result is: " + result);
}

}
这是我的计算器课

public class Calculator {

public Stack<Double> operands;
public Stack<Character> operators;

//Constructor
public Calculator() {
    operands = new Stack<>();
    operators = new Stack<>();
}

public Double solve(String equation) {
char current;
String number1 = "";
double value1;

for(int i = 0; i < equation.length(); i++) {
    current = equation.charAt(i);

    switch(current) {
        case '1': case'2': case'3':
        case '4': case'5': case'6':
        case '7': case'8': case'9': case '0': 
            while(isOperand(current))
                number1 += current;
            value1 = Double.parseDouble(number1);
            operands.push(value1);
            break;

        case '+': case '-': case '*': case '/':
           while(!operators.empty() && !hasPrecedence(operators.peek(), current)) {
               value1 = popStackAndSolve(operands, operators);
               operands.push(value1);
           }
           operators.push(current);
           break;
        case '(':
            operators.push(current);
            break;
        case ')':
            char topOperator = operators.peek();
            while(topOperator != '(') {
                value1 = popStackAndSolve(operands, operators);
                operands.push(value1);
                topOperator = operators.peek();
            }
            operators.pop();
            break;
        default: 
            break;
    }
    while(!operators.empty()) {
        value1 = popStackAndSolve(operands, operators);
        operands.push(value1);
    }
}   

return operands.peek();
}
公共类计算器{
公共堆栈操作数;
公共堆栈运营商;
//建造师
公共计算器(){
操作数=新堆栈();
运算符=新堆栈();
}
公共双解(弦方程){
炭流;
字符串编号1=“”;
双值1;
对于(int i=0;i
(我没有包括isOperand()、HasPreference()和popStackAndSolve()方法,因为它们可以正常工作。但是,如果您希望看到它们,请告诉我。)

我相信我在这里犯了一个非常简单的PEBCAC错误,但我不知道这对我来说意味着什么。我花了几个小时浏览教科书、论坛和Javadoc,却找不到解决方案。如果您能提供任何建议,我将不胜感激

编辑:它将错误抛出到行上(double result=calc.solve(等式);)


编辑2:已解决。非常感谢。id10t工作时出错。

您正在运行静态方法
main
(因为它是入口点)但是在生成
生成器
对象之前,您的
calc
对象是空的。您的注释行应该可以解决问题,所以请取消注释。

因为
main
是静态的,所以不会调用
Generator
构造函数,也不会为
calc
赋值。而不是在构造函数,在声明时初始化它,即使用

public static Calculator calc = new Calculator();
而不是

public static Calculator calc;
public Generator() {
    calc = new Calculator();
}

您的计算器是静态的,引用为空

调用生成器的构造函数可以解决这个问题

public static void main(String [] args) {
    Scanner scan = new Scanner(System.in);
    Generator  gen = new Generator ();
    System.out.println("Enter the string you want to process");
    String equation = scan.nextLine();
    double result = calc.solve(equation);

    System.out.println("Result is: " + result);
}

用静态初始值设定项替换这段代码:
public Generator(){calc=new Calculator();}
static{calc=new Calculator();}
为什么注释掉了
//calc=new Calculator();