Есть ли способ узнать, почему происходит следующая ошибка индексации? - PullRequest
0 голосов
/ 13 апреля 2020

Я запрограммировал код java, который имеет два вектора v1 и v2. Теперь v1 и v2 оба хранят данные в форме пакета (предположительно), который содержит формат, такой как v1.add("A",1,2) или v2("B",3,4), предположим, что размер пакета равен 3. Теперь v2 проверит, находится ли его пакет уже в v1 , Если он есть, то v2 удалит пакет, а если его нет в v1, то пакет будет добавлен в v1 и будет удален из v2. Например, v1["A",1,2] и v2["A",1,1,"A",1,2].

Теперь v2 начнется с "A". Он найдет A в v1. Тогда это будет go до 1. Опять же, он будет go до 1 и v2 не найдет 1 в v1. И он добавит ("A",1,1) к v1 и удалит его из v2. Так v1 стоит ["A",1,2,"A",1,1] и v2 будет стоять с ["A",1,2]. Теперь v2 снова проверит, находится ли ["A",1,2] в v1 или нет. Программа начнет проверку с начала v1. И он найдет "A", затем 1, затем 2. Так что v2 удалит ["A",1,2] из себя. Вот мой код:

package privatechecker;

import java.util.LinkedList;
import java.util.Vector;




public class Privatechecker {


    public static void main(String[] args) {
        int a=0,i=0,j=0,b=0,k=0;


     Vector v1= new Vector();
     Vector v2= new Vector();

     v1.add("A");
     v1.add(2);
     v1.add(3);

     v2.add("A");
     v2.add(2);
     v2.add(3);
     v2.add("B");
     v2.add(2);
     v2.add(3);
     v2.add("B");
     v2.add(2);
     v2.add(3);   
     v2.add("A");
     v2.add(7);
     v2.add(38);
     v2.add("C");
     v2.add(4);
     v2.add(5);
     v2.add("C");
     v2.add(10);
     v2.add(5);
     v2.add("C");
     v2.add(10);
     v2.add(5);
    do {
            for(j=0;j<v1.size()-1;){


               if(v2.get(i)== v1.get(j)){

                   i=i+1;
                   j=j+1;
                   a=0;

                   if(v2.get(i)== v1.get(j)){
                       i=i+1;
                       j=j+1;
                       a=0;
                       if(v2.get(i)== v1.get(j)){
                           System.out.println("Deleted "+v2.get(i));
                           v2.remove(i);
                           i=i-1;

                           System.out.println("Deleted "+v2.get(i));
                           v2.remove(i);
                           i=i-1;

                           System.out.println("Deleted "+v2.get(i));
                           v2.remove(i);
                           System.out.println("Buffered "+v2);

                           a=1;
                           i=0;
                           j=0;
                       }

                       else {

                           i=i-2;
                           j=j+1;
                           a=0;
                       }
                   }

                   else{


                       i=i-1;
                       j=j+2;
                       a=0;
                   }

               }

               else {

                   j=j+3;
                   i=0;
                   a=0;
               }
           }
           if(a==0){
               System.out.println("Added "+v2.get(i));
               v1.add(v2.get(i));
               v2.remove(0);


               System.out.println("Added "+v2.get(i));
               v1.add(v2.get(i));
               v2.remove(0);

               System.out.println("Added "+v2.get(i));
               v1.add(v2.get(i));
               v2.remove(0);


               System.out.println("Stored "+v1);
               System.out.println("Buffer "+v2);

               i=0;


    } 



           }
    while(v2.isEmpty()==false);

    System.out.println("Stored "+v1);
    System.out.println("Buffered "+v2);


    }


}

Теперь проблема в том, что я получаю

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 0
    at java.util.Vector.get(Vector.java:748)
    at privatechecker.Privatechecker.main(Privatechecker.java:53)
C:\Users\User\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1

Я не знаю, почему я получаю ошибку индексации, потому что я набрал несколько команд печати, чтобы проверить, векторные элементы получают правильно. Все они верны, даже если v1 и v2 содержат именно те элементы, которые я хочу. Но, как показывают ошибки, я не могу распечатать векторы за пределами l oop. Как это исправить?

1 Ответ

1 голос
/ 14 апреля 2020

Проблема возникает из-за того, что внутренний l oop продолжает повторяться после того, как v2 пуст.

Рассмотрим этот фрагмент вашего кода:

do {
    for(j=0;j<v1.size()-1;) {
       if(v2.get(i)== v1.get(j)) {
                   ...
}
while(v2.isEmpty()==false);

for l oop выше повторяется на v1. Но тело кода внутри удаляет записи из v2, что позволяет v2 опустеть до того, как l oop завершится, итерируя по v1.

Подход, который я использовал, чтобы найти проблему:

  1. В сообщении об ошибке Array index out of range: 0 указывалось, что это, скорее всего, операция с пустым вектором, поскольку для индекса 0 можно было бы выйти только из диапазона, если вектор был пустым.
  2. В сообщении об ошибке указывалось, в какой строке произошла ошибка: if(v2.get(i)== v1.get(j)) {
  3. Поскольку было два вызова метода, которые могли вызвать ошибку, я попытался выполнить эти вызовы метода в отдельных строках, чтобы увидеть, какая из них была вызывая ошибку:
v2.get(i);
v1.get(j);
Оказалось, что это v2.get(i), поэтому я начал искать способы доступа к v2 после того, как он был пустым, и именно это заставило меня взглянуть на условия выхода l oop.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...