2016-12-08 7 views
-1

割り当てのためには、ユーザーからの入力を得るためにSystem.in.read()を使用する必要があります。私は、ユーザーがそれを終了することを決定するまで、複数回使用できる電卓を作らなければなりません。コードは引き続きJavaを使用してSystem.in.read()からの入力を受け取ります

while(!stop) { 
     System.out.println("Enter the first digit."); 
     first = askForNumber(); 
     System.out.println("Enter the second digit."); 
     second = askForNumber(); 
     System.out.println("Enter the operation to perform"); 
     operation = askForCharacter(); 
     if(first == 0 && first == second) { 
      System.out.println("Calculator closing."); 
      stop = true; 
     } 
     if(operation == '+') { 
      System.out.println(first + second); 
     } 
     else if(operation == '-') { 
      System.out.println(first - second); 
     } 
     else if(operation == '*') { 
      System.out.println(first * second); 
     } 
     else if(operation == '/') { 
      if(second == 0) { 
       System.out.println("Cannot divide by zero."); 
       System.out.println("Calculator closing."); 
       stop = true; 
      } 
      System.out.println(first/second); 
     } 
     else { 
      System.out.println("Not an operation"); 
     } 
    } 

しかし、私は、私はこのエラーを取得するプログラム実行します。

45 
Enter the second digit. 
pls enter number 
45 
Enter the operation to perform 
+ 
90.0 
Enter the first digit. 
pls enter number 
Exception in thread "main" java.lang.NumberFormatException: For input string: "" 
at java.lang.NumberFormatException.forInputString(Unknown Source) 
at java.lang.Integer.parseInt(Unknown Source) 
at java.lang.Integer.<init>(Unknown Source) 
at lopezProject.LopezProject.askForNumber(LopezProject.java:17) 
at lopezProject.Calculator.main(Calculator.java:13) 

編集(askForNumberのコード()):あなたはIntegerに渡すcByte

public static double askForNumber() throws java.io.IOException { 
    char cByte; 
    String entireNumber = ""; 
    Integer n = 0; 
    System.out.println("pls enter number"); 
    while(true) { //while the user is still entering information 
    cByte = (char)System.in.read(); //each byte is being turned into a character 
    if ((cByte == ' ') || (cByte == '\n')) { 
    break; 
    } 
    if(java.lang.Character.isDigit(cByte)) { 
     entireNumber += cByte; //and added to the str string    
    } 
    } 
    if(entireNumber != "") { 
    n = new Integer(entireNumber.trim()); //turning the string into an integer 
    } 
    return (double)n.intValue(); 
    } 

public static char askForCharacter() throws java.io.IOException { 
    return (char)System.in.read(); 
    } 
+4

また、askForNumber()のコードを追加する必要があります – Reek

+1

なぜコンソールの一点に "pls enter number"と書かれていますか?それは入力ですか? askForNumber()から来ている@ aleb2000の – aleb2000

+0

とバグは、Reekが指摘しているようにそのメソッドにもあります。 – Jan

答えて

0

文字ではありませんが数字。ほとんどの場合、改行などがあります。何をすべきかは、entireNumberに追加する前に数字であることをcharでチェックし、そうでない場合は破棄します。使用を確認するにはjava.lang.Character.isDigit()
また、整数に渡す前にentireNumberが空でないことも確認する必要があります。あなたが操作を読むとき、あなたは単一の文字だけを読みますが、あなたはおそらくプラスの後に何かを押します。それでは、最初はaskForNumber()の整数に渡します。まだ空です。

そして、そのすべての上に、askForNumber()ループでは、行の終わりに遭遇したときにループから離れています。これはどこでも一貫して行われていればOKですが、あなたがやっていることではありません。
最初の数字に数字を入力してEnterキーを押すと、
の2桁目の数字が入力されます。あなたはそれを打ち込んでEnterキーを押します。=>休憩はありません。ちょうどinの最初の文字を読み、そこにEOLがあります。次のラウンドで何が起こるかは、ループ中に入力し、後続のEOLに遭遇し、最初の番号を入力する前にループを終了することです。ループしていない場合はループを終了し、そうでない場合はスキップして続行してください。ループを実行してループを実行し、正しいオペレーションが選択された後で終了するようにしてください。

また、上記のコードでは、entireNumber != ""のような文字列の直接比較を行います...うまくいきません。 Stringはオブジェクトであり、equals()という関数を呼び出すと、それを別のStringと比較する必要があります。

+0

これを使って変更しました: if(java.lang.Character.isDigit(cByte)){ \t \t \t全体番号+ = cByte; //と数字であることが、そのはまだ私に同じエラーを与えるためのcharをチェックstrの文字列\t \t \t \t \t} に加えます。 – SkyEthereality

+0

数値に変換する前にもう一度確認してください。それを含めるために私の答えを修正しました。 – Jan

+0

私はコードとOPを変更しましたが、今度はこのエラーが発生しています: 最初の桁を入力してください。 pls番号を入力 2桁目を入力してください。 pls番号を入力実行する操作を入力してください + 9.0 最初の桁を入力してください。 pls数字を入力 2桁目を入力してください。 pls数字を入力 - -3.0 最初の桁を入力してください。 pls数字を入力 2桁目を入力してください。 pls番号 正しく実行された後 – SkyEthereality

関連する問題