CommandLine Java计算器

时间:2011-08-21 11:42:24

标签: java calculator

我刚刚学习了java,但是根据我从C ++中获得的旧经验,我认为我可以编写一个命令行计算器,它只需要一行支持所有4个基本操作符。但我有点问题。

这是我的代码:

import java.util.Scanner;

public class omg {
    public static void main(String args[]) {
        int fnum,snum,anum = 0;
        String strtype; //The original calculation as string
        char[] testchar; //Calculation as chararray
        char currentchar; //current char in the char array for the loop
        int machinecode = 0; //Operator converted to integer manually
        String tempnumstr; //first and second numbers temp str to be converted int
        int operatorloc = 0; //operator location when found
        char[] tempnum = new char[256];
        Scanner scan = new Scanner(System.in); // The scanner obviously
        System.out.println("Enter The Calculation: ");
        strtype = scan.nextLine();
        testchar = strtype.toCharArray(); //converting to char array
        for(int b = 0; b < testchar.length; b++) //operator locating
        {
            currentchar = testchar[b];
            if(currentchar == '+') {
                machinecode = 1;
                operatorloc = b;
            }
            else if(currentchar == '-') {
                machinecode = 2;
                operatorloc = b;
            }
            else if(currentchar == '*') {
                machinecode = 3;
                operatorloc = b;
            }
            else if(currentchar == '/') {
                machinecode = 4;
                operatorloc = b;
            }
        }
        for(int t = 0;t < operatorloc;t++) { //transferring the left side to char
            tempnum[t] = testchar[t];
        }
            tempnumstr = tempnum.toString(); //converting char to string
            fnum = Integer.parseInt(tempnumstr); //parsing the string to a int
        for(int temp = operatorloc;temp < testchar.length;temp++) { //right side
            for(int t = 0;t<(testchar.length-operatorloc);t++) {
                tempnum[t] = testchar[temp];
            }
        }
        tempnumstr = tempnum.toString(); //converting to char
        snum = Integer.parseInt(tempnumstr); //converting to int
        switch(machinecode) { //checking the math to be done
        case 1:
            anum = fnum + snum;
            break;
        case 2:
            anum = fnum - snum;
            break;
        case 3:
            anum = fnum * snum;
            break;
        case 4:
            anum = fnum / snum;
        }
        System.out.println(anum); //printing the result
    }
}

这是我的代码但是当我运行它时会询问我的计算然后给出这个错误。

Exception in thread "main" java.lang.NullPointerException
    at omg.main(omg.java:38)

可能有一种更好更简单的方法,我希望听到更好的方法和修复我的方式。提前致谢

7 个答案:

答案 0 :(得分:7)

你声明:

char[] tempnum = null;

但你在哪里设置=非空值?因此,每当您尝试使用它时,就像它是一个完全驱动的物体一样,您将获得一个NPE抛出。

编辑:您的代码中还有其他问题,包括在数组上调用toString(),该数组将返回数组的默认值toString - 而不是您想要的那种情况。

所以不是这样:

tempnumstr = tempnum.toString();

你可能想要这样的东西:

tempnumstr = new String(tempnum); 

或可能

tempnumstr = new String(tempnum).trim(); // get rid of trailing whitespace if needed

编辑2:您的程序中似乎有两个char数组,tempnum和testchar,一个用字符填充,另一个不用。他们俩的目的是什么?考虑使用一些注释来编写代码,这样我们就能更好地理解它并且能够更好地帮助您。

答案 1 :(得分:6)

Hovercraft Full Of Eels已经向您指出了NullPointerException.的原因除此之外,我还看到了很多可以在代码中改进的东西。我就是这样做的:

import java.util.Scanner;

public class SimpleCalculator {

    public static void main(String[] args) {
        System.out.println("Please enter your calculation");
        Scanner scanner = new Scanner(System.in);
        int left = scanner.nextInt();
        String op = scanner.next();
        int right = scanner.nextInt();
        System.out.println(compute(left, op, right));
    }

    private static int compute(int left, String op, int right) {
        switch (op.charAt(0)) {
        case '+':
            return left + right;
        case '-':
            return left - right;
        case '*':
            return left * right;
        case '/':
            return left / right;
        }
        throw new IllegalArgumentException("Unknown operator:" + op);
    }
}

请注意,扫描程序假定操作员之前和之后都有空格。

示例输出:

Please enter your calculation
1 + 2
3

详细的改进:

  1. 可以在首次使用变量时声明变量。在Java中习惯于利用它(更短的代码大小,不需要重复变量名称。)
  2. 除了阅读整行外,
  3. Scanner还提供了标记功能。无需重新发明轮子。
  4. char(整数类型)可以switch编辑。

答案 2 :(得分:2)

你的问题就在这一行:

tempnum[t] = testchar[t];

如先前将其声明为null,将抛出NullPointerException:char[] tempnum = null;

您需要将其更改为char[] tempnum = new char[size];,它会将其初始化为空数组以保存类型char。其中size是任何整数。

答案 3 :(得分:1)

char[] tempnum = null;

应该设置为

char[] tempnum = new char[4];

在第38行使用时基本上为空。

答案 4 :(得分:0)

在第38行,您尝试访问变量tempnum,该变量初始化为null,您必须初始化变量tempnum,如下所示: tempnum = new char[n] 其中n将是数组的长度

答案 5 :(得分:0)

当您尝试在数组上下文中使用tempNum时,您忘记分配NUllPointerException

char[].toString()将不会按预期执行(它返回数组对象的哈希码),使用数组内容使用new String(char[])创建字符串。

答案 6 :(得分:0)

首先,此行出错:tempnum[t] = testchar[t]; 原因:tempnum没有指向任何事物(null) 修复:tempnum = testchar;tempnum = new char[testchar.length]