0

私はJavaを始めたばかりで、簡単な電卓をプログラムしようとしていました:

私は次のことを試しました:

    double x, y; //inputs
    Scanner sc = new Scanner(System.in);
    System.out.println("x?");
    x = sc.nextDouble();
    System.out.println("y?");
    y = sc.nextDouble();

    double answer = 0;

    System.out.println("Operation type: (+,-,*,/)");


    String opStr= sc.nextLine();
    char op = opStr.charAt(0);


    switch(op)
    {
        case '+':
            answer=x+y;
            break;

        case '-':
            answer=x-y;
            break;

        case '*':
            answer=x*y;
            break;

        case '/':

            if (y==0)
            {
                System.out.println("Error, can't divide by zero");
            }
            else
            {
                answer=x/y;
            }

            break;
        default: System.out.println("Unkown operation");
    }  // switch end

    System.out.println("answer = " +x+op+y+"=" + answer);

実行しようとすると、次のようになります: (x と y を入力できますが、後でエラー メッセージが表示されます。

Operation type: (+,-,*,/)
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.String.charAt(String.java:686)
    at edf_1.EDF_1.main(EDF_1.java:170)
Java Result: 1
BUILD SUCCESSFUL (total time: 3 seconds)

誰かが間違いや問題を見つけるのを手伝ってくれたら本当に感謝しています!

ありがとう

NaC

4

3 に答える 3

8

nextDouble() 行末を処理しません。したがって、nextLine()もう一度呼び出すと、前に入力したエンター( \n) が入力として使用されます。したがって、実際の入力をスキップして、\nによって逃された前の入力からを飲み込みnextLine()ます。nextLine()本物の前に別のものを呼び出す必要がありますnextLine()(したがって、 を飲み込みます\n)。

それをしたくない場合はScanner、同じオブジェクトを使用するのではなく、別のオブジェクトを構築する必要があります。

それがあなたの理由ですStringIndexOutOfBoundsException,はこの時点でopStrのみです.\n

于 2013-09-29T12:17:47.533 に答える
0

Java の学習を始めたときに、世界で最も簡単な電卓を作成しました。これはうまくいくはずです:

import java.util.Scanner;
public class CalculatorProgram {
Scanner scan = new Scanner(System.in);
int N1;
int N2;
int O = 0;
System.out.println("Enter the first number:");
N1 = scan.nextInt();
System.out.println("Enter the second number:");
N2 = scan.nextInt();
System.out.println("Press 1 for addition, 2 for subtraction, 3 for multiplication, 4 for       division
O=scan.nextInt();
switch (O){
case 1:
O=N1+N2;
System.out.println(O);
break;
case 2:
O=N1-N2;
System.out.println(O);
break;
case 3:
O=N1*N2;
System.out.println(O);
break;
case 4:
O=N1/N2;
System.out.println(O);
break;

default:
System.out.println("That is an invalid selection. Thank you for using this program.");
break;

} 
}

}

どういたしまして。

于 2014-03-04T02:47:47.743 に答える
0

問題は、ダブルを読み取った後、スキャナー入力が空ではないことです。したがって、 の呼び出しnextLine()はすぐに戻り、浮動小数点値 (空の可能性がある) として解析できなかった最後の入力の部分を返します。sc.nextLine()操作を要求する前に呼び出すと、次の呼び出しでsc.nextLine()操作を含む行が読み取られます。

于 2013-09-29T12:30:29.663 に答える