卡在循环while while循环使用try
我是一个字符串来做一个简单的计算器,如果一个人被零除以它不会破坏代码。我真的没有什么理想,我做了什么我可以做什么。我需要得到这个不要school.my家庭作品读取执行加,减,乘和除两个numbers.handle无效异常和算术异常。卡在循环while while循环使用try
import java.util.*;
public class Calcultator {
/**
* @param args
*/
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int w1=0;
int w2=0;
int w3=0;
double i1 = 0;
double i2=0;
String sign1 = null;
double sum=0;
do {
try {
System.out.println("Enter a your first number");
i1=scan.nextDouble();
w1++;
System.out.println("il="+1l);
System.out.println("w1="+w1);
} catch(Exception e) {
System.out.println("you must enter a number");
w1=0;
}
} while(w1==0);
do {
try {
System.out.println("Enter a your first number");
i2=scan.nextDouble();
w1++;
} catch(Exception e) {
System.out.println("you must enter a number");
}
} while(w2==0);
do {
try {
System.out.println("1)/ 2)* 3)- 4)+");
int sign=scan.nextInt();
switch(sign) {
case 1:
if(i1==0 || i2==0){
System.out.println("Zero can not be Devided");
break;
} else {
sign1="/";
break;
}
case 2:
sign1="*";
break;
case 3:
sign1="-";
break;
case 4:
sign1="+";
break;
default :
break;
}
} catch(Exception e) {
System.out.println("you must enter a number");
}
} while(w3==0);
if(sign1=="/") {
sum=i1/i2;
System.out.println(i1 +"/"+i2+"="+sum);
} else if(sign1=="*") {
sum=i1*i2;
System.out.println(i1 +"*"+i2+"="+sum);
} else if(sign1=="-") {
sum=i1-i2;
System.out.println(i1 +"-"+i2+"="+sum);
} else {
sum=i1+i2;
System.out.println(i1 +"+"+i2+"="+sum);
}
scan.close();
}
}
首先,你在第二do-while循环做了一个坏的复制/粘贴:
do {
try {
System.out.println("Enter a your first number"); // should say "Enter a your second number"
i2=scan.nextDouble(); // correct
w1++; // should be w2 - but I'd use a bool instead
} catch(Exception e) {
System.out.println("you must enter a number");
//need to set w2 in here - added below
w2 = 0;
}
} while(w2==0);
w2
在这个循环中从来没有改变(你改变w1
代替),所以它将始终为0,并且永远不会退出循环。 而不是使用int w1,
,w2
和w3
,然后不重用他们,我会使用一个单一的(有意义的名字命名的)布尔变量作为一个风格问题:
boolean validInput = false;
do {
try {
System.out.println("Enter your first number");
i1 = scan.nextDouble();
validInput = true;
} catch(Exception e) {
System.out.println("You must enter a number");
validInput = false;
}
} while(!validInput);
validInput = false;
// Second loop to follow using validInput instead of w2
你的switch语句看起来大多不错,但再,你永远不会改变w3
。我建议再次使用validInput
。在你的第一种情况下,你也说明零不能被分割,这是不正确的。 0可以被分割(0 /任何== 0),但是你不能被零除。您还需要处理用户输入无效操作的情况(即签署< 1或签署> 4)。 我也会在设置符号的地方进行计算,最后不需要多次计算。 我建议什么:
validInput = false;
double result = 0;
String operationStr = null; // I'll use operationStr instead of sign1, so the reader knows what it's for
do {
try {
// More understandable output for the user (unless it must be in the format you supplied)
System.out.println("Enter an operation: ");
System.out.println("Enter 1 for /");
System.out.println("Enter 2 for *");
System.out.println("Enter 3 for -");
System.out.println("Enter 4 for +");
int inputOperation = scan.nextInt(); // inputOperation instead of sign for readability: + and - are signs, * and/aren't.
switch(inputOperation) {
case 1:
if(i2 == 0){ // only need to worry about dividing BY zero
System.out.println("Error: cannot divide by zero - undefined");
} else {
operationStr = "/";
validInput = true;
result = i1/i2;
}
break; // only really need one break statement, but this is again a trivial matter of style.
case 2:
operationStr = "*";
validInput = true;
result = i1 * i2;
break;
case 3:
operationStr = "-";
validInput = true;
result = i1 - i2;
break;
case 4:
operationStr = "+";
result = i1 + i2;
break;
default:
// An invalid int was entered, out of the range of our operators
System.out.println("Error: Please enter a valid operation: 1, 2, 3, or 4 ")
break;
}
} catch(Exception e) {
System.out.println("you must enter a number");
}
} while(validInput = false);
System.out.println(i1 + operationStr + i2 + "=" + result);
scan.close();
// End of program
最后一点,还有,你可能需要修正了许多拼写错误和严重命名变量,在你的代码,该标记不会与马虎语法太深刻的印象或拼写错误。尝试根据他们的做什么来命名变量,以便您的标记和任何阅读它的人都可以轻松理解您的代码。例如,改名为i1 input1。使用boolean validInput
而不是int w1, w2, w3
,因为通过查看它们,这些没有任何意义。在涉及变量的操作中的值之间使用空格以提高可读性,最后,正确使用缩进,以便读者理解您的循环。
非常感谢。那么它为什么会陷入第一个循环而catch语句不起作用。如果我无法获得第一个循环的工作,我不会专注于第二个循环。对于sloopy代码,我很遗憾。我对它仍然是新的。我了解基础知识。它在学校没有帮助,我一直在学习android编程使用可能会有点混乱。他们都使用java和如此不同。谢谢ypu我会尽我所能采取您的建议。再次感谢您。 – matti
可能的重复http://stackoverflow.com/questions/28623651/scanner-nextline-return-null/28623706#28623706 –
请使用一致的缩进来正确格式化您的代码。目前很难阅读。我怀疑你使用了空格和制表符的组合,这就是为什么它会被破坏。对于SO,如果您只使用空格缩进,则效果最佳,因此“标签”的宽度没有多大差别。 –
提示:你的catch语句是**不**有帮助。它只是告诉你“发生了同样的错误”。将其更改为告诉**发生了哪种错误,例如通过打印其消息和/或堆栈跟踪。而代码格式**很重要**。我还建议在**命名上花费更多时间,因为你使用的名字不会告诉他们背后的事情。 – GhostCat