2011-11-07 10 views
0

Javaの次の単純なコードは、私が理解できない奇妙なやり方で多少動作します。うまく動作しない単純なJavaコード

final public class Main 
{ 
    public static void main(String[] args) 
    { 
     Scanner sc = new Scanner(System.in); 
     System.out.print("\nHow many names? "); 

     int n = sc.nextInt(); 
     String[] a = new String[n]; 

     a[0] = sc.nextLine(); //This line serves no purpose at all. It's useless and should be removed. 

     for (int i=0; i<n; i++) 
     { 
      System.out.print("\nEnter the name:->"); 
      a[i] = sc.nextLine(); //request for input only inside the loop. 
     } 

     for (int i=0; i<a.length; i++) 
     { 
      System.out.println(a[i]); 
     } 
    } 
} 

上全く問題にうまく機能し、コンソール上にアレイ[]に入力名の数を表示するが、私はライン[0] = を除去されsc.nextLine(); //この行はまったく役に立たない。それは役に立たず、削除する必要があります。の場合、最初に多数のユーザーが表示されます。のは、そこには問題はありませんが、ループが反復処理を開始したとき、それはメッセージの名前を入力して名前と初めて聞いてきます。3.を言わせて: - >が二回


表示され、出力がものになるだろう以下に示すように。

名前はいくつですか? 3

名前を入力します。 - >Don't allow to enter the name here.

名前を入力します。 - >タイガー

名前を入力します。 - >ザピター

タイガー

ピター


「名前はいくつですか?」と入力していますが、入力する名前。どうして?上記のコードがうまく機能していることを再び


注意。この問題は、上記の段落で太字で指定された行がコメントアウトされている場合にのみ発生します。

+1

「何か不明なことが起こっています。」は有用な質問タイトルではありません。おそらくあなたはより具体的に編集することができます... –

答えて

6

Scanner.nextInt()を使用すると、新しい行(または他の区切り文字)自体を消費しないため、返される次のトークンは通常は空の文字列になります。したがって、あなたはScanner.nextLine()でそれを追跡する必要があります。代わりにa[0]に割り当てるの結果を破棄することができます

int n = sc.nextInt(); 
sc.nextLine(); 

それは私がはいつもnextLine(またはBufferedReader.readLine())を使用してInteger.parseInt()を使用した後の解析を行っている提案はこのためです。

3

あなたは3行を読んでいます。あなたが持っている問題は、nextInt()がint値を読み込み、行の終わりを読み込み消費しないということです。 (一般的な間違い)

残りの行を無視したいと言うなら、nextLine()が必要です。

1

nextInt呼び出しはintからintの後ろに入力を読み込みますが、intの後に改行文字は読み込みません。したがって、最初の反復では「名前を入力」と表示され、プレーヤー数(空の文字列)を入力した行の最後を読み取るnextLine()が呼び出されます。次に、2回目の繰り返しが開始され、「名前を入力」と表示され、改行文字を入力するまでnextLine()がブロックされます。

関連する問題