Akshit Gupta Ответов: 3

Java array out of bound issue


У меня есть код для Java, в котором я создаю список 2 массивов из 2-мерного массива.. Но я получаю массив из связанного исключения.. Я передаю 2 мерного массива в метод класса ответа.. Но это не работает..

import java.io.*;
import java.util.*;

public class Abc {
    static void answer(Integer[][] a,int l){
        Integer[] un = new Integer[l];
        Integer[] un1 = new Integer[l];
        final Integer z = 0;
        int max1=0,max2=0,count1=0,count2=0;
        int ind=0;
        ArrayList<integer> arr1 = new ArrayList<integer>(Arrays.asList(a[0][l])); // Line 14
        ArrayList<integer> arr2 = new ArrayList<integer>(Arrays.asList(a[1][l]));

        for(int i=0;i<l;i++){
            if(i % 2 == 0){
                max1 = Collections.max(arr1);
                count1 += max1;
                ind = arr1.indexOf(max1);
                arr1.set(ind,z);
                arr2.set(ind,z);
            }
            else{
                max2 = Collections.max(arr2);
                count2 += max2;
                ind = arr2.indexOf(max2);
                arr2.set(ind,0);
                arr1.set(ind,0);
            }

        }

        if(count1 < count2){
            System.out.println("Second");
        }
        else{
            if(count1 > count2){
                System.out.println("First");
            }
            else{
                System.out.println("Tie");
            }

        }

    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int times = sc.nextInt();
        for(int i=0;i<times;i++){
            int val = sc.nextInt();
            Integer[][] arr = new Integer[2][val];
            for(int k=0;k<2;k++){
                for(int j=0;j<val;j++){
                arr[k][j] = sc.nextInt();
                }
            }

             Abc.answer(arr,val);

        }

    }
}


Ошибка: исключение в потоке "main" java.lang.ArrayIndexOutOfBoundsException: 3
at Abc.answer(Abc.java:14)
в Abc.main(Abc.java:80)

Заранее Спасибо!

Что я уже пробовал:

Я передаю 2-мерный массив из основного метода в метод ans.. Но я получаю исключение ArrayOutOfBound..

3 Ответов

Рейтинг:
7

Richard MacCutchan

Я подозреваю, что проблема заключается в следующем:

ArrayList<integer> arr1 = new ArrayList<integer>(Arrays.asList(a[0][l]));
ArrayList<integer> arr2 = new ArrayList<integer>(Arrays.asList(a[1][l]));
//
// a[0][l] is not an array, but a reference to a single element
//
//
// Try:
ArrayList<integer> arr1 = new ArrayList<integer>(Arrays.asList(a[0]));
ArrayList<integer> arr2 = new ArrayList<integer>(Arrays.asList(a[1]));

Кроме того, зачем вы создаете эти два массива un и un1- так как ты никогда ими не пользуешься?


Akshit Gupta

Спасибо, сэр, это сработало.. Я забыл удалить заявление о декларации для ООН и un1..

Рейтинг:
1

phil.o

a[0][l]

Если a имеет l элементы в его втором измерении, то эти элементы индексируются от нуля до l - 1. Таким образом, a[0][l] будет выброшено исключение.
Если вы хотите получить доступ к последнему элементу, вы должны использовать a[0][l - 1] вместо.

  • Элементы в первом измерении индексируются от нуля до l - 1.
  • Элементы во втором измерении индексируются от нуля до l - 1.

Вы также можете попробовать использовать отладчик что позволит вам очень быстро заметить и понять, что происходит внутри вас.
Любезно.


Akshit Gupta

@phil.o Сэр, вы имеете в виду "ArrayList<integer> arr1 = new ArrayList<integer>(Arrays.asList(a[0][l]));" ?

phil.o

Например, да. Везде, где вы пытаетесь получить доступ к элементу at l индекс, вы получите исключение, потому что самый большой индекс когда - либо будет l - 1.

Akshit Gupta

Сэр, но по моим ограниченным знаниям, разве мы не должны объявлять Арри как[размер][размер] ? Например, если нам нужно 2*8 элементов в массиве, мы объявляем его как[2][8].. Следовательно, ArrayList<integer> arr1 = new ArrayList<integer>(Arrays.asList(a[0][l]));..

phil.o

Да, вы объявляете его как[размер][размер].
Каждое измерение будет содержать элементы размера, но эти элементы размера будут проиндексированы от нуля до размера - 1.
Почему индексация массива в Java начинается с 0?

Akshit Gupta

Сэр, не могли бы вы указать на заявление, в котором я обращаюсь к нему из-за границы.. Будет большая помощь..

phil.o

Везде вы используете l как индекс; Я не могу быть более точным.

Рейтинг:
0

Patrice T

Error: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3

Это сообщение об ошибке означает, что ваш код пытается получить доступ к элементу массива, который не существует.
Java основана на нуле, это означает, что массив размера 3 имеет элементы с номерами 0, 1 и 2.
at Abc.answer(Abc.java:14)

Здесь вам дается позиция ошибки.
К сожалению, этот код не является полным, и строка 14 не использует массив.

Используя отладчик, вы сможете проверять переменные в точке ошибки и точно видеть, в какой ОС возникла проблема.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Akshit Gupta

Сэр, Извините, но обновляется ошибка : в ABC.ответ(АВС.Ява:14) на ABC.главный(АБС.Ява:58)..

Patrice T

Обновите свой вопрос, чтобы показать, где находится строка 14 в исходном коде.

Akshit Gupta

Сделано Сэр