Java 简单数学到英语计算器

Java 简单数学到英语计算器,java,exception,Java,Exception,我目前正在修一门基础编程课程。老师拒绝看我的代码,试图猜我问的问题,然后回答那个(不正确的)问题。基本原理是,它应该取一个方程,比如5*6,然后输出“5乘以6等于30”,答案只是一个数字。我现在拥有的代码如下: package mainPackage; import java.util.*; public class Main { public static void main(String[]args) { Scanner scan = new Scanner(System.in

我目前正在修一门基础编程课程。老师拒绝看我的代码,试图猜我问的问题,然后回答那个(不正确的)问题。基本原理是,它应该取一个方程,比如5*6,然后输出“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"
有人知道为什么会这样吗?我觉得好像我错过了一件非常明显的事情


编辑:非常感谢大家的快速回复。她从未教过我们分裂法。再次感谢

如果您知道输入是数字、空格、运算符、空格和数字,则表示输入长度为五个字符。除此之外的任何事情都是错误的。然后还可以检查这五个字符是否与给定的格式匹配


通常,在将用户输入传递给需要特定输入的方法之前,应该始终验证用户输入。用户可以输入任何内容,由您的程序来确保输入符合所需格式。

这可以使用
String.split(String regex)
函数来完成

String arr[] = input.split("\\s+");// splitting input by space 

numInt1 = Integer.parseInt(arr[0]);//5
numInt2 = Integer.parseInt(arr[2]);//6
char b = arr[1].charAt(0);//*

你的问题很可能在这些方面

a = input.substring(firstSpace--);
b = input.charAt(firstSpace++);
我看到两个问题。首先,使用--and++实际上改变了firstSpace的值。看起来b将包含空格,而不是算术运算符。您可以通过在其中添加一些System.out.println()消息来帮助自己弄清楚发生了什么,以查看索引变量发生了什么

其次,具有单个参数的substring方法创建从给定索引到字符串末尾的子字符串。我想你可能真的想做一些事情,比如:

a = input.substring(0, firstSpace-1);

这将为您提供从输入开始到第一个空格之前的字符的子字符串。

首先,我认为您应该熟悉调试器。它非常有用,如果不需要它,几乎不可能编写超过20行的程序;)

现在考虑两件事:substring(beginIndex)返回从该索引(基于0)开始到字符串结尾的子字符串。 这就是为什么
“5*6”。子字符串(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;
你失去了你想要达到的目标。 有几种方法可以解决你的问题。其中一些建议如上所述。有些人使用更先进的工具,但是你也可以在没有其他帮助方法的情况下解决问题(时间更长、更难看,但仍然有效)。
我的建议是习惯使用调试器,它可以帮助您在这种情况下快速发现问题。

您好,欢迎访问该网站。你试过调试吗?如果您使用Eclipse,您可以在调试模式下运行它,设置断点,并逐步执行应该是
a=input.substring(0,firstSpace--)啊,从索引到结尾?出于某种原因,我认为这只是那个特定的索引,谢谢!我不能相信我忘记了它向变量中添加了一个,而不仅仅是方法。谢谢你提到这个!我抛出了一个if(input.length>5)系统。退出(0);在这里,谢谢你们。这非常有效,我很高兴你们都提到了这种分割方法。从没听说过,也没人教过,但它对我在其他程序中遇到的一些问题非常有效。