2016-08-05 105 views
-1

我是一个字符串来做一个简单的计算器,如果一个人被零除以它不会破坏代码。我真的没有什么理想,我做了什么我可以做什么。我需要得到这个不要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(); 
} 
} 
+2

可能的重复http://stackoverflow.com/questions/28623651/scanner-nextline-return-null/28623706#28623706 –

+1

请使用一致的缩进来正确格式化您的代码。目前很难阅读。我怀疑你使用了空格和制表符的组合,这就是为什么它会被破坏。对于SO,如果您只使用空格缩进,则效果最佳,因此“标签”的宽度没有多大差别。 –

+0

提示:你的catch语句是**不**有帮助。它只是告诉你“发生了同样的错误”。将其更改为告诉**发生了哪种错误,例如通过打印其消息和/或堆栈跟踪。而代码格式**很重要**。我还建议在**命名上花费更多时间,因为你使用的名字不会告诉他们背后的事情。 – GhostCat

回答

1

首先,你在第二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,w2w3,然后不重用他们,我会使用一个单一的(有意义的名字命名的)布尔变量作为一个风格问题:

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,因为通过查看它们,这些没有任何意义。在涉及变量的操作中的值之间使用空格以提高可读性,最后,正确使用缩进,以便读者理解您的循环。

+0

非常感谢。那么它为什么会陷入第一个循环而catch语句不起作用。如果我无法获得第一个循环的工作,我不会专注于第二个循环。对于sloopy代码,我很遗憾。我对它仍然是新的。我了解基础知识。它在学校没有帮助,我一直在学习android编程使用可能会有点混乱。他们都使用java和如此不同。谢谢ypu我会尽我所能采取您的建议。再次感谢您。 – matti