Java 在类调用期间获取空指针异常。可能的构造函数错误
我正在编写一个程序,将中缀表达式作为字符串输入,并对其求值,结果返回一个double。然而,当我从main调用Calculator类时,我得到一个空指针异常。我的构造器中缺少了什么吗 这是我的主要类,从中调用计算器: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
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();
?