Java索引超出范围错误

时间:2014-02-06 02:54:58

标签: java for-loop indexoutofboundsexception

我在程序中遇到索引超出范围的问题。底部方法中的for循环应该按照flightSeatingAmount()方法中指定的次数运行。但是在运行程序进行测试时我一直遇到错误。有时我会在错误输出之前得到一个或两个输出,有时我没有得到任何输出,只有错误。这是我的代码:

import java.io.FileNotFoundException;
import java.io.PrintWriter;

public class OLE1 {

static String[] airports = {"LAX", "MSP", "FAR", "ATL", "ORD", "DFW", "DEN", "JFK", "SFO", "CLT", "LAS", "PHX", "IAH", "MIA", "PEK", "CAN", "HND", "HKG", "SIN", "LHR", "CDG", "LGW", "MUC", "FRA", "EDI"};
static final int numberOfEntries = 10000;
static String[] firstNames = {"Isis", "Donnette", "Reyes", "Willis", "Kathy", "Elizbeth", "Long", "Jim", "Devorah", "Magda", "Maryetta", "Keturah", "Corrinne", "Shena", "Xiao", "Otha", "Hallie", "Pennie", "Dong", "Kristopher", "Eveline", "Ardella", "Tien", "Tianna", "Loren", "Many", "Anjelica", "Cecile", "Mae", "Jenae", "Sonya", "Dotty", "Florance", "Mittie", "Katia", "Nena", "Lu", "Janee", "Armando", "Leandro", "Claris", "Claudine", "Moriah", "Eddie", "Susan", "Rhoda", "Monnie", "Emelia", "Cory", "Ying"};
static String[] lastNames = {"Belva", "Nam", "Liz", "Jeanett", "Corine", "Abe", "Olga", "Olevia", "Ernestine", "Joanne", "Sharyn", "Heidi", "Zachariah", "Sylvester", "Luetta", "Stephaine", "Garrett", "Debby", "Judi", "Noe", "Maybelle", "Eldora", "Roseann", "Madge", "Glayds", "Eleonore", "Josephine", "Quincy", "Alyson", "Earlene", "Clementina", "Jeri", "Kristel", "Carrol", "Zona", "Eileen", "Margherita", "Joline", "Terence", "Christinia", "Eldon", "Arleen", "Aimee", "Chanda", "Carin", "Prudence", "Tanja", "Kathlene", "Kareen", "Geneva"};
static String[] middleInitial = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
static int day = (int)(Math.random() * 21);

public static void main(String args[]) throws FileNotFoundException {

    System.out.println("Welcome to the airplane program. This program will go ahead and create a list of all the passengers that have gone through 25 different airports.");
    System.out.println("The list of the airports we keep track of are listed below\n");

    //for listing out the airport names
    int count = 0;
    for (int i = 0; i < 5; i++) {
        System.out.print(airports[count]);
        count++;
        System.out.print(" | " + airports[count]);
        count++;
        System.out.print(" | " + airports[count]);
        count++;
        System.out.print(" | " + airports[count]);
        count++;
        System.out.println(" | " + airports[count]);
        count++;
    }

    flightManifest();

}

public static int flightSeatingAmount() {
    int flight = (int)(50 + (Math.random() * 800));
    return flight;
}

public static String nameGenerator() {
    String names = "";
    int firstAndLast = (int)(Math.random() * 50);
    int initial = (int)(Math.random() * 26);
    names = lastNames[firstAndLast] + "," + firstNames[firstAndLast] + "," + middleInitial[initial];
    return names;
}

public static int flightTimeIntervel() {
    int timing[] = {15, 30, 45, 00};
    int randomTiming = (int)(Math.random() * 4);
    return timing[randomTiming];
}

public static int airportSelectionOne() {
    int airportOne = (int)(Math.random() * 49);
    return airportOne;
}

public static int airportSelectionTwo() {
    int airportTwo = (int)(Math.random() * 49);
    return airportTwo;
}

public static void flightManifest() throws FileNotFoundException {

    System.out.println(flightSeatingAmount());
    for (int i = 0; i <= flightSeatingAmount(); i++) {
        System.out.println(nameGenerator() + "," + "0" + "," + airports[airportSelectionOne()]);
    }

}

}

以下是我得到的输出:

Welcome to the airplane program. This program will go ahead and create a list of all         the passengers that have gone through 25 different airports.
The list of the airports we keep track of are listed below

LAX | MSP | FAR | ATL | ORD
DFW | DEN | JFK | SFO | CLT
LAS | PHX | IAH | MIA | PEK
CAN | HND | HKG | SIN | LHR
CDG | LGW | MUC | FRA | EDI
843
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 45
    at OLE1.flightManifest(OLE1.java:70)
    at OLE1.main(OLE1.java:33)

843指的是循环应该执行多少次。

4 个答案:

答案 0 :(得分:1)

您的airportSelectionOne返回45.您的机场阵列中没有46个机场。这意味着你已经远远超过了数组的末尾,这是非法的。更改您的函数,以便它不会返回高于数组大小的数字。提示:您可以通过airports.length

来判断数组的大小

答案 1 :(得分:1)

将以下代码更改为具有正确的数组大小。

int airportOne = (int)(Math.random() * [size of airport array - 1]);

答案 2 :(得分:0)

你对这个循环有问题:

for (int i = 0; i <= flightSeatingAmount(); i++) {
        System.out.println(nameGenerator() + "," + "0" + "," + airports[airportSelectionOne()]);
    }

您正在方法flightSeatingAmount()中生成一个随机数,也可能是zero,然后您尝试初始化该大小的数组。但是,你必须检查airportSelectionOne()是否也是随机分配,是否在大小范围内。

答案 3 :(得分:0)

public static void flightManifest() throws FileNotFoundException {

    System.out.println(flightSeatingAmount());
    for (int i = 0; i <= flightSeatingAmount(); i++) {

//GOOD INFORMATION!!!
System.out.println("airportSelectionOne()=" + airportSelectionOne() + ", airports.length=" + airports.length + "");

        System.out.println(nameGenerator() + "," + "0" + "," + airports[airportSelectionOne()]);
    }    
}

我在上面的函数中间添加的System.out.println非常具有启发性......