программа с массивами на java

Я должен написать программу, которая могла бы принимать пользовательский ввод имени самолета, пункта назначения, количества пассажиров и времени полета. Пользователя спрашивают, сколько самолетов он хотел бы обработать. Я знаю, что должен использовать массивы. Вот мои текущие коды, но они останавливаются после ввода имени первого самолета.

вот что происходит:

Введите авиакомпанию: French Air Введите количество самолетов для обработки: 3 Введите название самолета: ABC Введите пункт назначения: Токио Введите количество пассажиров: 156 Введите время полета: 10:15 Введите название самолета: DEF Введите пункт назначения: Чили Введите количество пассажиров: 88 Введите время полета: 11:00 Введите название самолета: FGH Введите пункт назначения: Майами Введите количество пассажиров: 157 Введите время полета: 12:00

Сегодняшний отчет о международных рейсах для FrenchAir

САМОЛЕТЫ НАЗНАЧЕНИЕ КОЛИЧЕСТВО ПАССАЖИРОВ ВРЕМЯ ПОЛЕТА ABC Токио 156 10:15 DEF Чили 88 11:00 FGH Майами 157 12:00

Исключение в потоке «основной» java.lang.ArrayIndexOutOfBoundsException: 4 в AircraftsReport.main(AircraftsReport.java:54)

Вот мои текущие коды:

import java.util.*;

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

        String airline = "";
        String strAircraft = "", strDestination = "", strFlightTime = "";
        int passengersCount = 0, num2process = 0, ctr = 0, ctr2 = 0;

            System.out.print("Enter airline company: ");
        airline = input.nextLine();

        System.out.print("Enter number of aircrafts to process: ");
        num2process = input.nextInt();

        String[] AIRCRAFTS = new String[num2process];
        String[] DESTINATIONS = new String[num2process];
        String[] FLIGHT_TIME = new String[num2process];
            int[] PASSENGERS_COUNT = new int[num2process];

        while(ctr < num2process)
        {
            System.out.print("Enter aircraft name: ");
            strAircraft = input.next();
            AIRCRAFTS[ctr] = strAircraft;

            System.out.print("Enter destination: ");
            strDestination = input.next();
            DESTINATIONS[ctr] = strDestination;

            System.out.print("Enter number of passengers: ");
            passengersCount = input.nextInt();
            PASSENGERS_COUNT[ctr] = passengersCount;

            System.out.print("Enter flight time: ");
            strFlightTime = input.next();
            FLIGHT_TIME[ctr] = strFlightTime;

            ctr++;

        }


        System.out.println("Today's report of international fligts for" +
                        airline);

        System.out.println("\nAIRCRAFTS\tDESTINATION\tNUMBER OF PASSENGERS" +
                "\tFLIGHT TIME");

        for(ctr2 = 0; ctr2 <= AIRCRAFTS.length; ctr2++)
        {
            System.out.print(AIRCRAFTS[ctr2] + "\t" + DESTINATIONS[ctr2] + 
                    "\t" + PASSENGERS_COUNT[ctr2] + "\t" + FLIGHT_TIME[ctr2]);
            System.out.println();

        }

    }

}

Помогите пожалуйста разобраться что не так

Он создает выходные данные вместе с Исключением в потоке "main" java.lang.ArrayIndexOutOfBoundsException: 4 в AircraftsReport.main(AircraftsReport.java:54)


person Doha Kik    schedule 16.12.2012    source источник
comment
Почему бы вам не рассказать нам о том, что вы наблюдаете, вместо того, чтобы заставлять нас читать этот код?   -  person duffymo    schedule 16.12.2012


Ответы (5)


В этой строке

int passengersCount = 0, num2process = 0, ctr = 0, ctr2 = 0;

вы объявляете num2process как 0.

Итак, следующая строка

String[] AIRCRAFTS = new String[num2process];

создает массив нулевой длины.

Через несколько строк после этого вы переназначаете num2process:

num2process = input.nextInt();

но это не изменит размер ранее созданного массива.

Вы входите в цикл do while один раз (потому что они всегда выполняются хотя бы один раз), и впоследствии проверка условия завершается ошибкой.

} while(ctr < AIRCRAFTS.length);

потому что ctr в этот момент равно 1 (после выполнения ctr++;), а AIRCRAFTS.length по-прежнему равно 0.

person jlordo    schedule 16.12.2012

Я бы рекомендовал объект Aircraft вместо отдельных списков всех этих предметов. Java — объектно-ориентированный язык. Лучше инкапсулировать связанные атрибуты в один класс и использовать его.

public class Aircraft {
    private String aircraft;
    private String destination;
    private Date departureTime; 
    private int maxPassengers;

    // You add the rest.
}

// and this in your main    
public Aircraft [] aircrafts = new Aircraft[numAircraft];

Но если это слишком сложно для вас, я бы порекомендовал научиться читать исключения:

java.lang.ArrayIndexOutOfBoundsException: 4 at AircraftsReport.main(AircraftsReport.java:54)

Откройте AircraftsReport.java в текстовом редакторе и включите отображение номеров строк. Перейдите к строке 54 - вот где ваша ошибка.

Этот код работает. Я бы рекомендовал изучить его, чтобы понять, почему:

import java.util.Scanner;


/**
 * AircraftsReport description here
 * @author Michael
 * @link http://stackoverflow.com/questions/13900443/arrays-program-in-java/13900477#comment19154335_13900477
 * @since 12/16/12 6:33 AM
 */
public class AircraftsReport {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        String airline = "";
        String strAircraft = "", strDestination = "", strFlightTime = "";
        int passengersCount = 0, num2process = 0, ctr2 = 0;

        System.out.print("Enter airline company: ");
        airline = input.nextLine();

        System.out.print("Enter number of aircrafts to process: ");
        num2process = input.nextInt();

        String[] AIRCRAFTS = new String[num2process];
        String[] DESTINATIONS = new String[num2process];
        String[] FLIGHT_TIME = new String[num2process];
        int[] PASSENGERS_COUNT = new int[num2process];

        // changed this
        for (int ctr = 0; ctr < num2process; ++ctr) {
            System.out.print("Enter aircraft name: ");
            strAircraft = input.next();
            AIRCRAFTS[ctr] = strAircraft;

            System.out.print("Enter destination: ");
            strDestination = input.next();
            DESTINATIONS[ctr] = strDestination;

            System.out.print("Enter number of passengers: ");
            passengersCount = input.nextInt();
            PASSENGERS_COUNT[ctr] = passengersCount;

            System.out.print("Enter flight time: ");
            strFlightTime = input.next();
            FLIGHT_TIME[ctr] = strFlightTime;
        }


        System.out.println("Today's report of international fligts for"+
                airline);

        System.out.println("\nAIRCRAFTS\tDESTINATION\tNUMBER OF PASSENGERS"+
                "\tFLIGHT TIME");

        // changed this
        for (ctr2 = 0; ctr2 < AIRCRAFTS.length; ctr2++) {
            System.out.print(AIRCRAFTS[ctr2]+"\t"+DESTINATIONS[ctr2]+
                    "\t"+PASSENGERS_COUNT[ctr2]+"\t"+FLIGHT_TIME[ctr2]);
            System.out.println();

        }

    }

}
person duffymo    schedule 16.12.2012
comment
Что вы имеете в виду под остальным в своем комментарии? будьте добры ответьте пожалуйста. Это пустая основная часть? - person Doha Kik; 16.12.2012
comment
Нет - конструкторы, геттеры/сеттеры, фактическое поведение, которое вы можете дать Aircraft, equals, hashcode, toString, compareTo - методы. - person duffymo; 16.12.2012
comment
Братан, я не настолько хорошо разбираюсь в предметах. Мои приведенные выше коды производят вывод, но он имеет исключение в потоке main java.lang.ArrayIndexOutOfBoundsException: 4 в AircraftsReport.main(AircraftsReport.java:54) ПОЖАЛУЙСТА, ПОМОГИТЕ - person Doha Kik; 16.12.2012
comment
Я не твой братан, и вещи придут, если ты продержишься достаточно долго. Это исключение означает, что вы пытаетесь пройти через конец массива. - person duffymo; 16.12.2012

Вы инициализируете значение num2process после того, как определили массивы. Размер массивов равен 0. Измените код следующим образом.

System.out.print("Enter airline company: ");
airline = input.nextLine();

System.out.print("Enter number of aircrafts to process: ");
num2process = input.nextInt();

String[] AIRCRAFTS = new String[num2process];
String[] DESTINATIONS = new String[num2process];
String[] FLIGHT_TIME = new String[num2process];
int[] PASSENGERS_COUNT = new int[num2process];
person Sumit Trehan    schedule 16.12.2012

Проблема с вашим кодом заключается в том, что вы инициализируете массив нулевого размера, а затем просите пользователя ввести num2process. это может помочь

        System.out.print("Enter airline company: ");
        airline = input.nextLine();

        System.out.print("Enter number of aircrafts to process: ");
        num2process = input.nextInt();
         // Then initialize your arrays


        String[] AIRCRAFTS = new String[num2process];
        String[] DESTINATIONS = new String[num2process];
        String[] FLIGHT_TIME = new String[num2process];
            int[] PASSENGERS_COUNT = new int[num2process];
person Harry47    schedule 16.12.2012

Ну, во-первых, не инициализируйте свои массивы, пока не узнаете, сколько должно быть num2process. Просто посмотрите на то, что ваши массивы имеют размер 0. Спросите num2process, а затем сделайте свои массивы. Это, вероятно, решит вашу проблему. Поскольку цикл проходит один раз и возвращает 0 (потому что вы инициализировали массивы с 0 до того, как спросили)

person user1832787    schedule 16.12.2012