Renshinzen Ответов: 1

Может ли кто-нибудь сказать мне, почему эта java-программа показывает исключение "индекс массива вне границ"?


Я получил выходные данные для этой программы, когда я ее запустил, но я получаю "исключение в потоке "main" java.lang.ArrayIndexOutOfBoundsException: "ошибка во время выполнения.
Может кто-нибудь сказать мне, что пошло не так с моей программой?

ВОПРОС: Java-программа для печати массива в маятниковом расположении.

ТЕСТОВЫЙ ПРИМЕР
ВХОД:

5 //нет элементов в массиве

1

2

3

4

5

ВЫХОД:

1 2 3 4 5 //элементы в массиве

5 3 1 2 4 //маятниковое расположение массива

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

import java.io.*;
import java.util.*;
import java.lang.*;
public class TestClass 
{
	 public static void main(String[] args)throws IOException
     { 
      Scanner in = new Scanner(System.in);
       int n = in.nextInt();
       
       int a[] = new int[n];
       int b[] = new int[n];
       
  for(int i =0; i<n; i++)
     {
         a[i] = in.nextInt();
     } 
       int t=0; 
       for (int i=0; i<n ; i++)
       {
         for (int j =i+1; j<n; j++)
         {
           if (a[i] > a[j])
           {
             t=a[i];
             a[i]=a[j];
             a[j]=t;
           }
         }
       }
       
       for(int i =0; i<n; i++)
       {
         System.out.print(a[i]+" ");
       }
       
       int mid = (n-1)/2;
       int x = 1, lim = n-1-mid;
       
       b[mid] = a[0];
       
       for (int i=1; i<=lim; i++)
       {
         if((mid+i)<n)
           b[mid+i] = a[x++];
         if((mid-1)>=0)
           b[mid-i] = a[x++];
       }
       System.out.print("\n");
       for (int i=0; i<n; i++)
       {
         System.out.print(b[i]+" ");
	}}
}

ZurdoDev

Да, это означает, что вы пытаетесь получить доступ к индексу массива, а этот индекс не существует.

Например, a[8] не существует. Просто отладьте свой код и выясните, что вы делаете. На самом деле все очень просто.

1 Ответов

Рейтинг:
5

Daniele Rota Nodari

В вашем коде есть несколько циклов for.
Все они обращаются к элементам массива с помощью локальной индексной переменной, но границы индекса кажутся правильными.
Единственный цикл, в котором я вижу проблему, - это тот, который обращается б дважды.
Внимательно присмотревшись, я вижу то, что кажется опечаткой; полный цикл-это:

for (int i=1; i<=lim; i++)
       {
         if((mid+i)<n)
           b[mid+i] = a[x++];
         if((mid-1)>=0)
           b[mid-i] = a[x++];
       }

Второе если скорее всего будет проблемой;
так и должно быть:
if((mid-i)>=0)

вместо:
if((mid-1)>=0)


Renshinzen

Спасибо!! Я понял!!