2016-11-22 13 views
1

UPDATE! 元の問題を修正しましたが、若いメンバーと古いメンバーを表示する際にエラーが発生し、次のエラーがスローされます。助言がありますか?スレッドのおかげで「完了」と入力すると、Java終了配列

例外 "メイン" java.lang.IndexOutOfBoundsException:インデックス:4、サイズ:4 java.util.ArrayList.rangeCheck(ArrayList.java:653)で java.util.ArrayList.getで( ArrayList.java:429)NameAge.mainで (NameAge.java:46)

import java.util.Scanner; 
import java.util.ArrayList; 

public class NameAge { 
    public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 

    final int MAX_VALUE = 4; 

    ArrayList<String> nameList = new ArrayList<String>(); 
    ArrayList<Integer> ageList = new ArrayList<Integer>(); 

    Integer[] ages = new Integer[10]; 

    for (int i = 0; i < MAX_VALUE; i++) { 

     System.out.print("Enter a name: "); 
     String currentLine = input.next(); 

     if (currentLine.equals("DONE")) { 
     break; 
     } 

     nameList.add(currentLine); 

     System.out.print("Now enter an age for " + currentLine + ": "); 
     ageList.add(input.nextInt()); 

     } 

     System.out.print("\n"); 
     for(int i = 0; i < MAX_VALUE; i++) { 

      System.out.println("Name: " + nameList.get(i) + " Age: " + ageList.get(i)); 


     } 

     // DISPLAY YOUNGEST AND OLDEST OF ARRAY, PRODUCING ERRORS 
     int smallest = ageList.get(0); 
     int largest = ageList.get(0); 

     String oldest = nameList.get(0); 
     String youngest = nameList.get(0); 

     for (int i = 0; i < ages.length; i++) { 
      if(ageList.get(i) > largest) { 
       largest = ageList.get(i); 
       oldest = nameList.get(i); 

      } 
      else if(ageList.get(i) < smallest) { 
       smallest = ageList.get(i); 
       youngest = nameList.get(i); 
      } 

     } 
      System.out.println("\nThe youngest person is " + youngest + " who is " + smallest + " years old"); 
      System.out.println("The oldest person is " + oldest + " who is " + largest + " years old"); 

     } 

    } 
+3

正規表現はおそらく最も単純なものです。 – SomeJavaGuy

+0

2台のスキャナーは必要ありません。確認http://stackoverflow.com/questions/13102045/scanner-is-skipping-nextline-after-using-next-nextint-or-other-nextfoo – TheLostMind

答えて

2

コメントが示唆するように、私は、ここでは年齢の名前と1対1に2つの正規表現を使用します。また、スキャナからの入力を文字列として受け取ります。現在、あなたはScanner.nextInt()に電話していますが、数値以外のデータには失敗すると思います。このような場合は、通常のアプリケーションロジックがその入力をチェックしても決してヒットしません。代わりに、文字列として両方を読んでから、regexを使って入力のフォーマットを確認してください。

このような何かが動作するはず

String age = "35"; 
String name = "Tim Biegeleisen"; 

if (name.matches(".*[^a-zA-Z].*")) { 
    System.out.println("Not a valid name"); 
} 
if (age.matches(".*[^0-9].*")) { 
    System.out.println("Not a valid age"); 
} 
1

正規表現指摘したように、あなたの検証を成し遂げるための最も簡単な方法です。 java.util.regex.Patternhttps://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html)のjavadocもご覧ください。

name.matches("\\D+") // for anything other than numbers with length > 1 

name.matches("\\d+") // for numbers of length 1 and more 
関連する問題