java - 简单的数学到英语计算器

标签 java exception

我目前正在学习基础编程类(class)。老师拒绝查看我的代码并尝试猜测我所问的问题,然后回答该(不正确的)问题。其基本原理是,它应该采用一个方程,如 5 * 6,并输出“五乘六等于 30”,答案只是一个数字。我现在的代码是这样的:

package mainPackage;
import java.util.*;


public class Main 
{
public static void main(String[]args)
{
    Scanner scan = new Scanner(System.in);
    System.out.println("Please enter the equation");
    String input = scan.nextLine();

    String space = " ";

    int firstSpace = 0;
    int secondSpace = 0;

    int numInt1 = 0;
    int numInt2 = 0;

    String a = "0";
    char b = 'a';
    String c = "0";

    firstSpace = input.indexOf(space);


    String sub = input.substring((firstSpace + 1), input.length());

    secondSpace = sub.indexOf(space);

    a = input.substring(firstSpace--);
    b = input.charAt(firstSpace++);
    c = input.substring(secondSpace++);

    numInt1 = Integer.parseInt(a);
    numInt2 = Integer.parseInt(c);


    String num1 = "";
    String op = "";
    String num2 = "";

    switch (numInt1)
    {
        case 0:
        {
            num1 = "Zero";
        }

        case 1:
        {
            num1 = "One";
        }

        case 2:
        {
            num1 = "Two";
        }

        case 3:
        {
            num1 = "Three";
        }

        case 4:
        {
            num1 = "Four";
        }

        case 5:
        {
            num1 = "Five";
        }

        case 6:
        {
            num1 = "Six";
        }

        case 7:
        {
            num1 = "Seven";
        }

        case 8:
        {
            num1 = "Eight";
        }

        case 9:
        {
            num1 = "Nine";
        }
    }

    System.out.println(a);
    System.out.println(b);
    System.out.println(c);

}
}

她告诉我们,在每个数字和操作数之间,她会放置一个空格。所以不是 5/6,而是 5/6,我们只需要对 0 到 9 执行此操作,但仍然必须检测她是否输入了两位数,并打印无效数字。这部分我知道该怎么做。当我尝试运行这个时,问题就出现了。行中没有显示任何错误,但是当我运行它时,我得到:

Exception in thread "main" java.lang.NumberFormatException: For input string: " * 6"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at mainPackage.Main.main(Main.java:44)

这最终是这一行:

numInt1 = Integer.parseInt(a);

删除它们时,代码会打印出如下内容:

"5
 * 6
 * 6"

有谁知道为什么会这样吗?我觉得我错过了一些明显而痛苦的事情。

编辑:非常感谢大家的快速回复。她从来没有教过我们分割方法。再次感谢!

最佳答案

首先我认为你应该熟悉调试器。它非常有用,而且几乎不可能在不需要它的情况下编写超过 20 行的程序;)

现在在这里考虑两件事: substring(beginIndex) 返回从该索引(从 0 开始)到字符串末尾的子字符串。 这就是为什么 "5 * 6".substring(1) 将返回 "* 6" (1 是字符串中第一个空格的“位置”/索引“5 * 6",因为它是从 0 开始的)。 这就是为什么在将表达式解析为整数值时出现异常。 另一件事是,firstSpace++ 或firstSpace-- 将分别增加和减少firstSpace 的值,并将在命令的其余部分之后执行此操作。 所以实际上:

a = input.substring(firstSpace--);
b = input.charAt(firstSpace++);
c = input.substring(secondSpace++);

相当于这样的东西:

a = input.substring(firstSpace);
firstSpace = firstSpace - 1;
b = input.charAt(firstSpace);
firstSpace = firstSpace + 1;
c = input.substring(firstSpace);
firstSpace = firstSpace - 1;

而你却失去了你想要实现的目标。 您的问题有多种解决方案。上面建议了其中一些。有些使用更高级的工具,但您也可以在没有其他帮助方法的情况下解决问题(更长、更难看,但仍然有效)。 我的建议是习惯使用调试器,它可以帮助您在这种情况下很快找到问题。

关于java - 简单的数学到英语计算器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21578330/

相关文章:

java - MySQL:更新表列,同时将日期格式格式化为其他格式不起作用

java - 被困在密码更改代码中

java - Maven、Tomcat 和 Java_Home/JRE_home 变量

java - 如何以及何时使用(或不使用)三种特定情况下的异常(exception)情况?

ruby-on-rails - rails 中的异常处理有什么好的最佳实践吗?

c++ - Bad_alloc 问题

java - 简单的 XML 框架和 Android - 奇怪的类属性

java - Orika - 映射可选对象

java - 捕获意外异常是一种好习惯吗?

iphone - 如何使用iPhone的崩溃报告查找问题?