我试图让我的程序有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]
以外只有重启菜单......
答案 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();
}
}