Java:if语句如何读取数字和单词

时间:2017-01-06 13:57:57

标签: java if-statement

我试图让我的程序有if语句理解单词和数字,现在转换加倍到字符串,字符串加倍不是问题,但问题在于当用户输入"restart"时,该程序将不会转到我的重启菜单(restart01();),它会转到} else if (Grd1<5) {} else {,请帮助我... 这是我的程序(更深入,当你看到完整的东西时),但这是我有这个程序的5个部分(看起来很相似)之一...

public static void Gdr1() {
        try {
            System.out.print("[Code: Gdr1]  Grade 1: %");
            Scanner gdr1 = new Scanner(System.in);
            Z = gdr1.next();
            Z = Double.toString(Grd1);
            Grd1 = Double.parseDouble(Z);
            if ((Grd1<100)&&(Grd1>=5)) {
                Gdr2();
            } else if ((Grd1>=100)&&(Grd1<125)) {
                System.out.println("    System> Great Job "+Stu+"!");
                Gdr2();
            } else if (Grd1<5) {
                System.out.println("I'm sorry, the lowest grade I am allowed to compute is 5...");
                Gdr1();
            } else if (Z.equalsIgnoreCase("restart")) {
                restart01(); 
                //This is the only part that doesn't work...
            } else {
                System.out.println("("+Z+") cannot be resolved in my system...");
                Gdr1();
            }
        } catch (Exception e) {}
    }

现在一切都在程序中运行,除了最终用户的输入= " restart"之外,我知道程序中的一些代码看起来很复杂,但它确实有效(大部分都可以) ),任何人都可以帮我解决这个问题,我的学校投资组合将于2017年1月25日晚上11:59之前发布。

Z(常量字符串),""+Stu+""(变量输入)和[Code: Gdr1](重启菜单)之类的东西在程序中用于其他目的,需要它们那里,除了[Code: Gdr1]以外只有重启菜单......

3 个答案:

答案 0 :(得分:3)

Z = gdr1.next();
Z = Double.toString(Grd1);

您从扫描仪中读取,但直接用第二行覆盖您刚读取的值,有效地丢弃它,而是使用您static Double Grd1初始化的值。

删除第二行可以解决您的直接问题,但之后您将遇到另一个问题:现在Z有时会是&#34;重启&#34; String,下一行Double.parseDouble(Z)将失败。

正如Ninad Shaha在答案中提到的那样,你应该检查String是否是&#34;重启&#34;在尝试将其解析为Double之前。正如NoDataFound在他的回答中提到的那样,检查Scanner要读取的下一个标记是否事先是Double也会更优雅。

总之,这是我将如何做到的:

System.out.print("[Code: Gdr1]  Grade 1: %");
Scanner scanner = new Scanner(System.in);
if (scanner.hasNextDouble()) {
    // it's a Double
    Double d = scanner.nextDouble();
    /*
      conditions based on the double
    */
} else if (scanner.hasNext()) {
    // it's not a Double, so it may be "restart"
    String s = scanner.next();
    if ("restart".equalsIgnoreCase(s)) {
        restart01();
    } else {
        System.out.println("("+s+") cannot be resolved in my system...");
        Gdr1();
    }
}
// else we've read everything, we're done

其他说明:

  • 您的命名约定非常糟糕,无法帮助您调试代码。你有3个grd1 / Grd1:一个函数,一个扫描器和一个静态Double变量。花点时间正确命名变量,从长远来看,它会对你有所帮助。

  • 我认为你没有任何理由在这里使用静态变量,所以你应该避免使用它们。一开始可能很难理解和管理变量的范围,但这是必要的技能。

  • 当它没有意义时,你也应该避免使用递归。在这里它不会有问题,但如果你养成这种习惯,你很快就会遇到你的第一个StackOverflowError

  • 如果你不对它们做任何事情,没有理由去捕捉例外情况。您应该修改方法的签名以声明它可以抛出的异常(Exception如果您懒惰且IDE无法帮助,但特定的子类更好:提供更多信息如果您添加了引发新类型错误的操作,那么调用您的方法的人员以及您的代码将不再编译。

答案 1 :(得分:1)

使用Scanner的力量:

if (scanner.hasNextDouble())
  double d = scanner.nextDouble();
}

还有其他类型的其他方法,如果你想循环遍历令牌,你可以试试hasNext:

while (scanner.hasNext()) {
  if (scanner.hasNextDouble())
    double d = scanner.nextDouble();
  } else {
    String s = scanner.next();
  }
}

答案 2 :(得分:0)

为什么不能首先检查输入是否为字符串'restart',如果不是,则将其解析为double。像

if (Z.equalsIgnoreCase("restart")) {
                restart01();
            } else {
Grd1 = Double.parseDouble(Z);
            if ((Grd1<100)&&(Grd1>=5)) {
                Gdr2();
            } else if ((Grd1>=100)&&(Grd1<125)) {
                System.out.println("    System> Great Job "+Stu+"!");
                Gdr2();
            } else if (Grd1<5) {
                System.out.println("I'm sorry, the lowest grade I am allowed to compute is 5...");
                Gdr1();
    }
}