2016-11-22 68 views
1

更新! 我現在已經修復了原始問題,但是因爲我顯示最年輕和最老的成員時出現錯誤,並且引發以下錯誤。有什麼建議麼?由於當輸入'done'時Java終止陣列

異常線程 「main」 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 scanners.Check http://stackoverflow.com/questions/13102045/scanner-is-skipping-nextline-after-using-next-nextint-or-other-nextfoo – TheLostMind

回答

2

由於意見建議,我會在這裏使用兩個正則表達式,一個名字和一個時代。另外,我會將掃描器的輸入作爲字符串輸入。目前,您打電話給Scanner.nextInt(),我認爲這會導致非數字數據失敗。如果發生這種情況,您的正常應用程序邏輯檢查輸入將永遠不會被擊中。相反,讀取這兩個字符串,然後使用正則表達式來驗證輸入的格式。

像這樣的東西應該工作:

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"); 
}