-1

Java プログラムを内部で再起動する方法を数多く調べた結果、while ループが最も簡単な選択肢のように思えました。これは、私がこれを試している基本的な電卓プログラムの例です。

import java.util.Scanner;
class a {
public static void main(String args[]){
    boolean done = false;
    int oper;
    Scanner input = new Scanner(System.in);
    System.out.println("McMackins Calc v2.0 (Now with fewer crashes!)");
    while (!done)
    {
    System.out.println("What operation? (0 for quit, 1 for add, 2 for subtract, 3 for multiply, 4 for divide, 5 for divide with remainder, 6 for average, 7 for account interest):");
    while (!input.hasNextInt()){
        System.out.println("Enter a valid integer.");
        input.next();
    }
    oper = input.nextInt();
    switch (oper){
    case 0:
        done = true;
        break;
    case 1:
        add addObject = new add();
        addObject.getSum();
        break;
    case 2:
        sub subObject = new sub();
        subObject.getDifference();
        break;
    case 3:
        times multObject = new times();
        multObject.getProduct();
        break;
    case 4:
        divide divObject = new divide();
        divObject.getQuotient();
        break;
    case 5:
        remain remObject = new remain();
        remObject.getRemainder();
        break;
    case 6:
        avg avgObject = new avg();
        avgObject.getAvg();
        break;
    case 7:
        interest intObject = new interest();
        intObject.getInterest();
        break;
    default:
        System.out.println("Invalid entry.");
        break;
    }
    }
    input.close();
}
}

ただし、これはループの最初の最後に NoSuchElementException をスローするようで、プログラムをクラッシュさせます。このクラスの機能は、ユーザーからの初期入力を取得して、使用するクラスを決定することです。これにより、実行する数学演算が決定されます。while (!done)ループがなくてもすべて正常に動作します。

使用例:

McMackins Calc v2.0 (Now with fewer crashes!)
What operation? (0 for quit, 1 for add, 2 for subtract, 3 for multiply, 4 for divide, 5 for divide with remainder, 6 for average, 7 for account interest):
1
How many addends?
1
Enter your numbers now.
1
You have entered 1 addend.
The sum is: 1.0
What operation? (0 for quit, 1 for add, 2 for subtract, 3 for multiply, 4 for divide, 5 for divide with remainder, 6 for average, 7 for account interest):
Enter a valid integer.
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at a.main(a.java:13)

私はまた、他のクラスがこれを参照するようにしてみましたが、メインは静的メソッドであるため、意図した方法でアクセスできません。

私はJavaの初心者なので、私のプログラムは非常に単純です。可能な場合は単純に保つようにしてください。コードを投稿してから、DETAILでそれが何を意味するのかを説明して、修正するだけではありません。この問題だけでなく、将来の問題も。

ありがとうございました!

編集:

コードはエディター内でより適切にフォーマットされています。ここに投稿したとき、ブレースが奇妙な位置に出てきました。

どうやらa正しく書かれているので、これが私のaddクラスです。うまくいけば、これで何かが解決するでしょう。

import java.util.Scanner;
public class add {
public void getSum(){
    Scanner input = new Scanner(System.in);
    double total, addend;
    int entries, count;
    total = 0;
    count = 0;
    System.out.println("How many addends?");
    while (!input.hasNextInt()){
        System.out.println("Enter a valid integer.");
        input.next();
    }
    entries = input.nextInt();
    System.out.println("Enter your numbers now.");

    while (count < entries){
        while (!input.hasNextDouble()){
            System.out.println("Enter a valid number.");
            input.next();
        }
        addend = input.nextDouble();
        total = total + addend;
        count++;
        if (count == 1){
            System.out.println("You have entered " + count + " addend.");
        }else if (count > entries){
            System.out.println("You have entered too many addends! Contact program developer.");
        }else{
            System.out.println("You have entered " + count + " addends.");
        }
    }
    System.out.println("The sum is: " + total);
    input.close();
}
}
4

3 に答える 3

1

この問題を修正する方法を考えている将来のユーザーのために、いくつかの再プログラミングを通じて、私の問題がinputループの終了前に変数を閉じていることを発見しました。プログラムを無期限に再起動し、終了時にのみ閉じるinputことで、このプログラムは正常に動作します。

Benjamin の回答のおかげで、私は現在、forループを使用してコードをクリーンアップおよび短縮しています。

于 2013-08-29T20:40:39.457 に答える