2016-05-22 11 views
1

私はスタックを作成しようとしています。私はEclipseでデバッグツールを使用し、hasNextInt()が入力の最後に遭遇したときにコードが終了することを発見しました。次のコードは14番目のwhileループで終了し、コードの第18番目の文はif(sc.hasNextInt()) {となります。私はJVMメモリについても考えましたが、このコードは再帰的なものではなく、配列のサイズはわずか20です...hasNextInt()が入力の終了を検出すると、Javaは突然終了する

ここに入力して、コンソールにコピーして貼り付けました(最後の "top"は動作しません..)>>ここ

14 push 1 push 2 top size empty pop pop pop size empty pop push 3 empty top 

であるコード>>

import java.util.Scanner; 
public class User_Stack { 
    final static int SIZE = 20; 
    static int[] array = new int[SIZE]; 
    static int where = -1; 

    public static void main(String[] args) { 
     String test; int input=0, result=0, tc=1; 
     Scanner sc = new Scanner(System.in); 

     /*input the number of test cases*/ 
     int test_case = sc.nextInt(); 

     while(tc <= test_case){ 
      /*input what will do with Stack by String*/ 
      test = sc.next(); 
      /*what is pushed is input by Integer*/ 
      if(sc.hasNextInt()) { 
       input=sc.nextInt(); 
      } 
      /*call function by test String*/ 
      switch(test){ 
       case "push": 
        push(array, input); 
        break; 
       case "pop": 
        System.out.println(pop(array)); 
        break; 
       case "size": 
        System.out.println(size(array)); 
        break; 
       case "empty": 
        System.out.println(empty(array)); 
        break; 
       case "top": 
        System.out.println(top(array)); 
        break; 
      } 
     } 

    } 

    public static void push(int[] array, int x){ 
     if(where+1==SIZE) return; 
     array[++where]=x; 
    } 
    public static int pop(int[] array){ 
     if(where==-1) return array[where--]; 
     else return -1; 
    } 
    public static int size(int[] array){ 
     return where+1; 
    } 
    public static int empty(int[] array){ 
     if(where==-1) return 1; 
     else return 0; 
    } 
    public static int top(int[] array){ 
     if(where==-1) return array[where]; 
     else return -1; 
    } 
} 

答えて

1

これは、次の入力トークンのScanner待つことがintegerであるか否かを知ることがあるためであり、それに達するようにあなたの入力の終わり、それはいつまでも待っています。あなたは次のようpushに直接sc.nextInt()を移動する必要があります:私たちはwhileループで.hasNextInt()を使用できない理由

while(tc <= test_case){ 
    /*input what will do with Stack by String*/ 
    test = sc.next(); 

    /*call function by test String*/ 
    switch(test){ 
     case "push": 
      push(array, sc.nextInt()); 
      break; 
     case "pop": 
      System.out.println(pop(array)); 
      break; 
     case "size": 
      System.out.println(size(array)); 
      break; 
     case "empty": 
      System.out.println(empty(array)); 
      break; 
     case "top": 
      System.out.println(top(array)); 
      break; 
    } 
} 
+0

追加すると(sc.hasNext)役立たない場合があります。ありがとうございます!私はスキャナが次のinptを待っていたとは思いません。私はそれを試してみます! – pty115

+0

はい私は、あなたのケースで 'if(sc.hasNextInt())'が役に立ちません –

0

this question説明しています。
Javaスキャナクラスのメソッド.hasNextInt()は、入力の終了前に停止しません。
.hasNextInt()の入力の終わりは、一般的なキー入力によってトリガされない^ Zです。
これは、このコードが永遠に待つ間に発生した理由です。

関連する問題