【问题标题】:CommandLine Java Calculator命令行 Java 计算器
【发布时间】:2011-10-31 13:40:02
【问题描述】:

我刚刚学习了 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)

可能有更好、更简单的方法来做这件事,我想听听更好的方法和我的方法的修复。提前致谢

【问题讨论】:

  • 你的 C(++) 习惯是可见的。 Java 中的类应该以大写字母开头。变量中的每个单词也应以大写字母开头(例如:machineCode)。并且变量通常在且仅在使用时才被声明和初始化。并非所有方法的开头。 machineCode 应该是一个枚举而不是一个 int。
  • 在本论坛的第二篇文章中很好地使用了带有适当代码缩进的格式化代码!

标签: java calculator


【解决方案1】:

您声明:

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,一个用字符填充,一个不填充。他们俩的目的是什么?考虑在您的代码中添加一些 cmets,以便我们更好地理解它并更好地为您提供帮助。

【讨论】:

  • 我已经修复了 NPE 并评论了我的代码,但现在我有了'at java.lang.Integer.parseInt(Unknown Source)'
  • @Leararth2:您遇到了一个新问题,我们需要查看您更新的代码。由于这与原始问题无关并且为了保持清洁,您最好在关于 SO 的新问题中提出这个问题。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    你的问题是这一行:

    tempnum[t] = testchar[t];

    这将抛出一个 NullPointerException,因为您之前将其声明为 null:char[] tempnum = null;

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

    【讨论】:

      【解决方案4】:
      char[] tempnum = null;
      

      应该设置为类似

      char[] tempnum = new char[4];
      

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

      【讨论】:

        【解决方案5】:

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

        char[].toString() 不会像您期望的那样(它返回数组对象的哈希码),要使用数组的内容创建字符串,请使用 new String(char[])

        【讨论】:

          【解决方案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. Scanner 除了读取整行之外还提供标记化。无需重新发明轮子。
          3. char(整数类型)可以是switched on。

          【讨论】:

          • 不错的 1+。我什至不想提及一个小建议:在使用完资源后处理资源始终是一个好习惯,这包括 Scanner 对象,当您使用完它时应该关闭它。这确实不会使这个程序受益,这就是我不愿提及它的原因,但这是一个养成的好习惯,因为有时它确实很重要。 :)
          • 你的方法好得令人难以置信,但我还在学习 java :)。我只是想这样尝试。
          【解决方案7】:

          首先,它在这一行出错:tempnum[t] = testchar[t]; 原因:tempnum 没有指向任何东西(null) 修复:tempnum = testchar;tempnum = new char[testchar.length]

          【讨论】:

            猜你喜欢
            • 2011-10-31
            • 1970-01-01
            • 1970-01-01
            • 2014-06-12
            • 1970-01-01
            • 2015-07-17
            • 1970-01-01
            • 2014-05-02
            • 1970-01-01
            相关资源
            最近更新 更多