-4

有人可以請幫我弄清楚索引應該是什麼讓這個完全運行我已經嘗試了各種修復,沒有任何工作正常。我有一種感覺,這個問題是data String[][] data = new String[MAXPASSENGERS][6]; 第一個錯誤的第一個聲明是在這裏:從txt文件中獲取數據獲取java.lang.Arrayindexoutofboundsexception錯誤

int status = Integer.parseInt(data[i][1]); 

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1` at Titanic.getTotalNumberofPerishedPassengers(Titanic.java:43)1

第二個錯誤是在這裏:

int status = Integer.parseInt(data[i][1]); 

這裏

return getTotalPassengers() - getTotalNumberofPerishedPassengers(); 

帶有這些錯誤

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 at Titanic.getTotalNumberofPerishedPassengers(Titanic.java:43)

return getTotalPassengers() - getTotalNumberofPerishedPassengers(); 

第三個錯誤:

int status = Integer.parseInt(data[i][1]); 

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1, at TItanic.getTotalNumberofSurvivedPassengerByClass(Titanic.java:71)

如何解決這些讓我的代碼的運行是否正常?我試着改變數組的值,但是這並沒有做任何事情,我得到了同樣的錯誤結果。

/** 

*文件:TestTitanic.java作者:日期:8May15 */ 進口java.util.Scanner的;

/* TestTitanic用於測試泰坦尼克號數據 */ 公共類TestTitanic {

public static void main(String[] args) { 

    String fileName = ""; 
    Titanic titanic = null; 

    //Get the file name from command line arguments 
    if (args.length > 0) { 
     fileName = args[0]; 
    } else { 
     fileName = "titaniiiic.txt"; 
    } 

    // Check the file and create titanic statistics 
    try { 
     titanic = new Titanic(fileName); 
    } catch (Exception ex) { 
     System.out.println("File not found"); 
     System.exit(1); 
    } 

    //The application should keep track of the elapsed time (in seconds) 
    long startTime = System.currentTimeMillis(); 

    //A user-friendly and well-organized menu s 
    String choices[] = {"Total number of passengers on the Titanic", 
     "Total number of passengers who perished on the Titanic", 
     "Total number of Passengers who survived the sinking of the Titanic", 
     "Number of passengers who survived the sinking of the Titanic as a function of the passenger class (e.g. 1,2,3)", 
     "Number of passengers who survived the sinking of the Titanic as a function of the passenger gender (e.g., male, female)", 
     "A list of the names of passengers who paid greater than $200 for their tickets", 
     "A list of the names of passengers who were less than 10 years old who survived", 
     "A list of the names of passengers who were less than 10 years old who perished ", 
     "The count of the number of passengers as a function of the first letter of their last name. (e.g., A: 13, B:33 …)", "Exit" 
    }; 

    int choice = menuChoice(choices); 
    while (choice != 10) { 
     switch (choice) { 
      case 1: 
       System.out.println("Total number of passengers on the Titanic: " + titanic.getTotalPassengers()); 
       break; 
      case 2: 
       System.out.println("Total number of passengers who perished on the Titanic: " + titanic.getTotalNumberofPerishedPassengers()); 
       break; 
      case 3: 
       System.out.println("Total number of passengers who survived : " + titanic.getTotalNumberofSurvivedPassengers()); 
       break; 
      case 4: 
       System.out.print("Enter class (e.g. 1,2,3): "); 
       int cls = getIntInRange(1, 3); 
       System.out.println(cls + " class number of passengers who survived: " + titanic.getTotalNumberofSurvivedPassengersByClass(cls)); 
       break; 
      case 5: 
       System.out.print("Names of passengers who were less than 10 years old who survived: "); 
       System.out.println(titanic.getSurvivedNamesLessGivenAge(10)); 
       break; 
      case 6: 
       System.out.print("Enter the letter: "); 
       char ch = getString().charAt(0); 
       System.out.println("Count: " + titanic.getCountByFirstLetterOfFirstName(ch)); 
       break; 
     } 
     choice = menuChoice(choices); 
    } 

    //The application should keep track of the elapsed time (in seconds) 
    long endTime = System.currentTimeMillis(); 
    long elapsedTime = (endTime - startTime)/1000; 
    /** 
    * After the program is exited, the application should provide a prompt 
    * thanking the user for trying the Titanic program and providing the 
    * total time elapsed. 
    */ 
    System.out.println("Thank you for trying the Titanic program"); 
    System.out.println("Elapsed time: " + elapsedTime); 
} 

/** 
* Helper method to get String from user 
* 
* @return 
*/ 
public static String getString() { 
    Scanner input = new Scanner(System.in); 
    return input.nextLine(); 
} 

/** 
* Helper method to get user input in range 
* 
* @param low 
* @param high 
* @return 
*/ 
public static int getIntInRange(int low, int high) { 
    int num = 0; 
    do { 
     num = getInt(); 
     if (num < low || num > high) { 
      System.out.println("Enter number between " + low + " and " + high); 
     } 
    } while (num < low || num > high); 
    return num; 
} 

/** 
* 
* method to display organized menu to user 
* 
* @param choices 
* @return 
*/ 
public static int menuChoice(String choices[]) { 
    int choice = 0; 
    System.out.println(""); 
    for (int i = 0; i < choices.length; i++) { 
     System.out.println((i + 1) + ". " + choices[i]); 
    } 
    System.out.print("Enter choice (1-" + choices.length + "): "); 
    choice = getIntInRange(1, choices.length); 
    return choice; 
} 

/** 
* Helper method to get int from user 
* 
* @return 
*/ 
    public static int getInt() { 
     Scanner input = new Scanner(System.in); 
     int num = -1; 
     boolean good; 
      do { 
      good = true; 
      try { 
       num = input.nextInt(); 
      } catch (Exception e) { 
      good = false; 
       input = new Scanner(System.in); 
       System.out.println("Enter numeric value: "); 
      } 
     } while (!good); 
     return num; 
    } 
} 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 

// java class Titanic 
public class Titanic { 

    int MAXPASSENGERS = 10000; 
    int actualPassengers = 0; 
    //B. Use a 2D array to store the Titanic data. 
    String[][] data = new String[MAXPASSENGERS][6]; 

    /** 
    * Constructor to read file and set 2D array to store the Titanic data 
    */ 
    Titanic(String filename) throws FileNotFoundException { 
     Scanner fileReader = new Scanner(new File(filename)); 

     while (fileReader.hasNextLine()) { 
      //line has tab delimeted data 
      data[actualPassengers++] = fileReader.nextLine().split("\t"); 

     } 
     fileReader.close(); 
    } 

    /** 
    * 
    * @return Total number of passengers on the Titanic 
    */ 
public int getTotalPassengers() { 
     return actualPassengers; 
    } 

    /** 
    * 
    * @return Total number of passengers who perished on the Titanic 
    */ 
    public int getTotalNumberofPerishedPassengers() { 
     int count = 0; 
     for (int i = 0; i < getTotalPassengers(); i++) { 

      int status = Integer.parseInt(data[i][1]); 
      //Survived (1=yes, 0=no) 
      if (status == 0) { 
       count++; 
      } 
     } 
     return count; 
    } 

    /** 
    * 
    * @return Total number of Passengers who survived the sinking of the 
    * Titanic 
    */ 
    public int getTotalNumberofSurvivedPassengers() { 
     return getTotalPassengers() - getTotalNumberofPerishedPassengers(); 
    } 

    /** 
    * Number of passengers who survived the sinking of the Titanic as a 
    * function of the passenger class (e.g. 1,2,3) 
    * 
    * @param cls 
    * @return 
    */ 
    public int getTotalNumberofSurvivedPassengersByClass(int cls) { 
     int count = 0; 
     for (int i = 0; i < getTotalPassengers(); i++) { 
      int status = Integer.parseInt(data[i][1]); 
      int clazz = Integer.parseInt(data[i][0]); 
      //Survived (1=yes, 0=no) 
      if (status == 1 && clazz == cls) { 
       count++; 
      } 
     } 
     return count; 
    } 

    /** 
    * Number of passengers who survived the sinking of the Titanic as a 
    * function of the passenger gender (e.g., male, female) 
    * 
    * @param cls 
    * @return 
    */ 
    public int getTotalNumberofSurvivedPassengersByGender(String gender) { 
     int count = 0; 
     for (int i = 0; i < getTotalPassengers(); i++) { 
      int status = Integer.parseInt(data[i][1]); 
      //Survived (1=yes, 0=no) 
      if (status == 1 && gender.equalsIgnoreCase(data[i][3])) { 
       count++; 
      } 
     } 
     return count; 
    } 

    /** 
    * 
    * @param cls 
    * @return A list of the names of passengers who paid greater than given 
    * fair for their tickets 
    */ 
    public String getNamesPaidFare(double fair) { 
     String name = ""; 
     for (int i = 0; i < getTotalPassengers(); i++) { 
      if (data[i].length >= 6) { 
      double pfair = Double.parseDouble(data[i][5]); 
      if (pfair > fair) { 
       name += "\n" + data[i][2]; 
      } 
     } 
    } 
    return name; 
} 

/** 
* G. A list of the names of passengers who were less than 10 years old who 
* survived the sinking of the Titanic 
* 
* @param fair 
* @return 
*/ 
public String getSurvivedNamesLessGivenAge(int age) { 
    String name = ""; 
    for (int i = 0; i < getTotalPassengers(); i++) { 
     if (data[i].length >= 6 && data[i][4].length()>0) { 
       int status = Integer.parseInt(data[i][1]); 
       double pAge = Double.parseDouble(data[i][4]); 
      //Survived (1=yes, 0=no) 
      if (status == 1 && pAge < age) { 
       name += "\n" + data[i][2]; 
      } 
     } 
    } 
    return name; 
} 

/** 
* H. A list of the names of passengers who were less than 10 years old who 
* perished on the Titanic 
* 
* @param fair 
* @return 
*/ 
public String getPerishedNamesLessGivenAge(int age) { 
    String name = ""; 
    for (int i = 0; i < getTotalPassengers(); i++) { 
     if (data[i].length >= 6 && data[i][4].length()>0) { 
      int status = Integer.parseInt(data[i][1]); 
      double pAge = Double.parseDouble(data[i][4]); 
      //Survived (1=yes, 0=no) 
      if (status ==0 && pAge < age) { 
       name += "\n" + data[i][2]; 
      } 
     } 
    } 
    return name; 
} 

/** 
* The count of the number of passengers as a function of the first letter 
* of their last name. (e.g., A: 13, B:33 …) 
* 
* @param ch 
* @return 
*/ 
public int getCountByFirstLetterOfFirstName(char ch) { 
    int count = 0; 
    for (int i = 0; i < getTotalPassengers(); i++) { 
     char pChar = data[i][2].charAt(0); 

     if (Character.toUpperCase(ch) == Character.toUpperCase(pChar)) { 
      count++; 
     } 
    } 
    return count; 
} 

}

+0

請發表[最小,完整,可驗證的示例](http://stackoverflow.com/help/mcve)。 – MikeCAT

+0

顯示所有的代碼。沒有上下文,這些單獨的行是沒有意義的 –

+0

請發佈您的代碼。 –

回答

0

,所以我想通了修復到的ArrayIndexOutOfBounds錯誤,並得到它的工作。上述計劃的唯一剩餘問題是回答問題4(倖存者按課程)。下面是該Titanic.java類工作的那部分代碼:

/** 
    * Number of passengers who survived the sinking of the Titanic as a 
    * function of the passenger class (e.g. 1,2,3) 
    * 
    * @param cls 
    * @return 
    */ 
    public int getTotalNumberofSurvivedPassengersByClass(int cls) { 
     int count = 0; 
     for (int i = 0; i < getTotalPassengers(); i++) { 
      int status = Integer.parseInt(data[i][1]); 
      int clazz = Integer.parseInt(data[i][0]); 
      //Survived (1 = yes, 0 = no) 
      if (status == 1 && clazz == cls) { 
       count++; 
      } 
     } 
     return count;