命令行Java计算器 我刚刚学习了java,但是从C++的老经验中,我可以编写一个命令行计算器,它支持一行的所有4个基本操作符。但是我有点问题

命令行Java计算器 我刚刚学习了java,但是从C++的老经验中,我可以编写一个命令行计算器,它支持一行的所有4个基本操作符。但是我有点问题,java,calculator,Java,Calculator,这是我的代码: 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

这是我的代码:

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
    }
}
也许有一个更好更简单的方法可以做到这一点,我希望听到更好的方法和我的方式修复。提前感谢

您声明:

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:程序中似乎有两个字符数组,tempnum和testchar,一个用字符填充,另一个不填充。两者的目的是什么?考虑对代码进行一些注释,这样我们就能更好地理解它,并且能够更好地帮助你。< /P>

第38行,你尝试对变量<代码> TunnUM</代码>进行注册,初始化为Nult。

tempnum=newchar[n]

其中n是数组的长度

您的问题是这一行:

tempnum[t]=testchar[t]

它将抛出一个NullPointerException,正如您之前声明它为null一样:
char[]tempnum=null

您需要将其更改为
char[]tempnum=new char[size]
将其初始化为空数组,以保存type
char
。其中
size
是任意整数

char[] tempnum = null;
应该设置为

char[] tempnum = new char[4];

在第38行使用时,它基本上是空的。

您忘记分配
tempNum
,这导致在数组上下文中使用它时出现
NUllPointerException


char[].toString()
不会执行您期望的操作(它会返回数组对象的哈希代码),要使用数组的内容创建字符串,请使用
新字符串(char[])
装满鳗鱼的气垫船已经向您指出了
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
具体改进如下:

  • 变量可以在您第一次使用它们的地方声明。Java习惯于利用这一点(代码长度更短,无需重复变量名)
  • Scanner
    除了读取整行之外,还提供标记化。不需要重新发明轮子
  • char
    (整数类型)可以
    打开

  • 首先,它在这一行出错:
    tempnum[t]=testchar[t]
    原因:
    tempnum
    未指向任何对象(空)
    修正:
    tempnum=testchar
    tempnum=newchar[testchar.length]

    您的C++习惯是可见的。Java中的类应该以大写字母开头。变量中的每个单词也应该以大写字母开头(例如:machineCode)。变量通常在使用时声明和初始化。不是所有的方法都在一开始。machineCode应该是一个enum而不是int。在这个论坛上的第二篇文章中,很好地使用了带有适当代码缩进的格式化代码!不错的1+。我甚至不愿提及的一个小建议是:在处理资源时,处置资源始终是一个好习惯,这包括扫描器对象,当您使用完它时,它应该关闭。这真的对这个项目没有好处,这就是为什么我不愿意提及它,但这是一个好习惯,因为有时候它确实很重要。:)您的方式非常好,但我仍在学习java:)。我只是想这样试试。我修复了NPE并注释了我的代码,但现在我有了“at java.lang.Integer.parseInt(未知源代码)”@Leararth2:你有一个新问题,我们需要查看你的更新代码。因为这与原来的问题无关,为了保持事情的整洁,你最好用一个新问题来回答这个问题。
    Please enter your calculation
    1 + 2
    3