2012-04-21 8 views
0

私は単純なテキストベースのオペレーティングシステムを作成しようとしています。なぜ計算機クラスが完了した後に自分のコードでコマンドを入力できないのか理解できません。私は "オフ"と入力するまでコードを実行し続けることになっていますが、そうではありません。 Eclipseは実行していると言いますが、私は何もしません。誰か助けてくれますか?あなたのコードは無限ループになっているなぜこのコードは計算機クラスの終了後にコマンドを入力できないのですか?

public class Calculator extends Start{ 

public static void calStrt() { 

    System.out.print("\nEnter operator you wish to use: "); 
    StringInput = scan.nextLine(); 

    if (StringInput.equals("+")) { 

     add(); 

    } else if (StringInput.equals("-")) { 

     sub(); 

    } else if (StringInput.equals("*")) { 

     mul(); 

    } else if (StringInput.equals("/")) { 

     div(); 

    } else { 

     System.out.println("\nSyntax error: Operator not recognized"); 
     System.out.println("Please try again"); 
     calStrt(); 

    } 

} 

public static void add() { 

    System.out.print("\nEnter first number: "); 
    intInput = scan.nextInt(); 
    int intVar1 = intInput; 

    System.out.print("\nEnter second number: "); 
    intInput = scan.nextInt(); 
    int intVar2 = intInput; 

    System.out.println("\nAnswer: " + (intVar1 + intVar2)); 

} 

public static void sub() { 

    System.out.print("\nEnter first number: "); 
    intInput = scan.nextInt(); 
    int intVar1 = intInput; 

    System.out.print("\nEnter second number: "); 
    intInput = scan.nextInt(); 
    int intVar2 = intInput; 

    System.out.println("\nAnswer: " + (intVar1 - intVar2)); 

} 

public static void mul() { 

    System.out.print("\nEnter first number: "); 
    intInput = scan.nextInt(); 
    int intVar1 = intInput; 

    System.out.print("\nEnter second number: "); 
    intInput = scan.nextInt(); 
    int intVar2 = intInput; 

    System.out.println("\nAnswer: " + (intVar1 * intVar2)); 

} 

public static void div() { 

    System.out.print("\nEnter first number: "); 
    intInput = scan.nextInt(); 
    int intVar1 = intInput; 

    System.out.print("\nEnter second number: "); 
    intInput = scan.nextInt(); 
    int intVar2 = intInput; 

    System.out.println("\nAnswer: " + (intVar1/intVar2)); 

} 

} 




import java.util.Scanner; 

class Start { 

static Scanner scan = new Scanner(System.in); 
static String StringInput; 
static int intInput; 

public static void main(String[] args) { 

    System.out.println("\nWelcome to RobOS"); 

    passLoop: while (true) { 

     System.out.print("\nPlease enter password: "); 
     StringInput = scan.nextLine(); 

     if (StringInput.equals("banana")) { 

      System.out.print("Logging in, please wait"); 
      System.out.print("."); 
      System.out.print("."); 
      System.out.println("."); 

      System.out.println("\nWelcome User"); 

      outerLoop: while (true) { 

       System.out.println("\nType \"help\" to see a list of programs"); 

       StringInput = scan.nextLine(); 

       innerLoop: while (true) { 

        if (StringInput.equalsIgnoreCase("cal")) { 

         Calculator.calStrt(); 
         continue outerLoop; 

        } else if (StringInput.equalsIgnoreCase("guess")) { 

         GuessGame.guess(); 
         continue outerLoop; 

        } else if (StringInput.equalsIgnoreCase("help")) { 

         System.out.println("\n\"cal\" uses the calculator"); 
         System.out.println("\"guess\" plays guessing game"); 
         System.out.println("\"help\" shows list of programs"); 
         System.out.println("\"off\" turns RobOS off"); 
         continue outerLoop; 

        } else if (StringInput.equalsIgnoreCase("off")){ 

         break passLoop; 

        } 

       } 

      } 

     } else { 

      System.out.println("\nWrong password. Please try again"); 
      continue passLoop; 

     } 

    } 

} 

} 
+2

悪い入力で 'calStrt'の中から' calStrt'を呼び出したいですか?再帰のための悪い場所のように思えます。 –

+0

誰かが悪いコマンドを与えた場合、innerLoopのポイントは無限ループになりますか? –

答えて

1

:ここ

は私の二つのクラスです。 StringInput = scan.nextLine()に電話すると、初めて正常に動作します。私はcalと入力し、私は電卓を一度実行することができます。問題は、2回目のscan.nextLine()が呼び出されると、自動的に空の文字列 ""がStringInputの値として返されることです。 while(true)if/else文のセットはこれを処理する方法がないため、永遠にループします。

scan.nextInt()に電話してください。しかし、問題は電卓操作の2番目の数字を読むと、まだ "\ n"がSystem.inにあることです。その結果、ループしてscan.nextLine()を再度呼び出すと、何も聞かれません。なぜなら、それでもまだSystem.inに座っている "\ n"が読み込まれ、無限ループに入るからです。

+0

どうすればこの問題を解決できますか? – mrspy1100

+0

'System.in'で特定の操作が完了し、次の操作のためにそれをクリアするには、次のようにします:' System.in.skip(Long.MAX_VALUE); 'to 'System.in'の残りの部分を破棄するか、' add() 'の最後に' scan.nextLine() 'の別の呼び出しを挿入してみてください。理想的ではありませんが、機能します。標準入力には、このような厄介なエッジケースがたくさんあります。 –

+0

迅速で有益な回答をいただきありがとうございます! – mrspy1100

2

ブレントナッシュが正しいです。このエラーを修正するには、scan.nextInt()の代わりにInteger.parseInt(scan.nextLine()); の代わりに使ってみてください。

関連する問題