【问题标题】:pulling data from txt file getting java.lang.Arrayindexoutofboundsexception errors从 txt 文件中提取数据得到 java.lang.Arrayindexoutofboundsexception 错误
【发布时间】:2016-03-06 09:09:50
【问题描述】:

谁能帮我弄清楚索引应该是什么才能让它完全运行我已经尝试了各种修复程序,但没有任何工作正常。我感觉问题出在data 的第一个声明中 String[][] data = new String[MAXPASSENGERS][6]; 第一个错误在这里:

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

线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 1` 在 Titanic.getTotalNumberofPerishedPassengers(Titanic.java:43)1

第二个错误在这里:

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

这里

return getTotalPassengers() - getTotalNumberofPerishedPassengers();

出现这些错误

线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 1 在 Titanic.getTotalNumberofPerishedPassengers(Titanic.java:43)

return getTotalPassengers() - getTotalNumberofPerishedPassengers();

第三个错误:

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

线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 1,在 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;
}

}

【问题讨论】:

  • 显示所有代码。这些单独的行在没有上下文的情况下毫无意义。
  • 请发布您的代码。
  • ArrayIndexOutOfBoundException: 1 表示data[i][1] 中的一个索引(i1)大于您的数组。异常很可能是指第二个索引。然后查看填充数组的行。您使用split() 方法作为每一行的结果,因此数组的第二个维度取决于拆分结果。如果您读取一个没有制表符的字符串,split() 返回一个单元素数组。所以你必须检查你的数组的实际内容是什么。你真的应该学习一些调试技术。
  • 这里是它失败的调试行,但我以前从未使用过它,我不知道错误是什么意思。 (我最近才开始使用 netbeans。在我只是使用 cmd ln 错误来找出我做错了什么之前。//deugged 代码的第 83 行:&lt;java classpath="${classpath-translated}" classname="${classname}" dir="${work.dir}" jvm="${platform.java}" fork="true" failonerror="${java.failonerror}"&gt;

标签: java exception indexoutofboundsexception usage-statistics cmdline-args


【解决方案1】:

所以我想出了解决 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 2013-07-03
    相关资源
    最近更新 更多