Member 14019184 Ответов: 2

Проблема с массивом [JAVA]


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

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

это и есть ошибка:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0<br />
	at generale.Vettori.Caricamento(Vettori.java:39)<br />
	at generale.Generale.main(Generale.java:43)<br />
C:\Users\Peppe7\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1<br />
BUILD FAILED (total time: 4 seconds)


это класс:
package generale;
import java.io.*;

/**
 *
 * @author DE_VITA1700
 */
  public class Vettori {
        //*******************************************
        //Input
        InputStreamReader input = new InputStreamReader(System.in);
        BufferedReader tastiera = new BufferedReader(input);
        //******************************************* 
     private int N;
     
     public void setN(int x){
        N=x;
     }
     private int V[] = new int[N];
     public void Caricamento() {
         int dato=0;
         String numero;
       
         for(int i=0;i<N;i++) {
            try {
             System.out.print("Valore da inserire alla posizione n°" + i + ": ");
             numero = tastiera.readLine();
             dato = Integer.valueOf(numero).intValue();
            }
            catch(Exception e){
            System.out.println("Inserisci un numero!");
            }
            V[i]=dato;
         }
     }
         public void Stampa(){
         for(int i=0;i<V.length;i++){
             System.out.println(V[i]);
         }
     }
  
  
  
  }

Richard MacCutchan

Где находится код, который устанавливает значение N?

Member 14019184

Вот ты где:

публичный статический пустота главный(строка[] аргументы) {
//*******************************************
//Вход
InputStreamReader input = новый InputStreamReader(System.in);
Командой bufferedreader ноутбука = читает(вход);
//*******************************************

/*Меню m;
m = новое меню();
м. printMenu();
м. Вочи();*/
Веттори а;
int x;
int valore=0;
Строка numero;
пробовать {
Системы.из.печати("Грандезза Ветторе: ");
нумеро = ноутбука.с readline();
валоре = целое число.метод valueOf ("Калина").сертификата от его закодированной формы();
}
catch(исключение e){
System.out.println("Inserisci un numero!");
}
x = доблесть;
а = новый Веттори();
а.Caricamento(х);
а.Стампа();

Richard MacCutchan

Там нет кода, который вызывает setN для установки значения N. Вы также вызываете a.Caricamento(x); но Caricamento не принимает никаких параметров.

2 Ответов

Рейтинг:
1

Patrice T

Цитата:
В классе Веттори у меня возникает такая проблема, когда я толкаю цифры.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.
Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]

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


Рейтинг:
0

OriginalGriff

N-это целое число уровня класса, поэтому оно получает значение по умолчанию при создании экземпляра класса.
V - это массив уровня класса, который инициализируется при создании экземпляра класса в массив из N элементов.
Все это происходит до вызова конструктора класса, так что конструктор может использовать переменные.

Поскольку значение N по умолчанию равно нулю, то V инициализируется массивом нулевых элементов. Любая попытка получить доступ к любому элементу массива завершится ошибкой "Index out of bounds" , поскольку в массиве нет элементов!

Изменение N в более поздний момент с помощью вашего setN метод не приведет к повторной инициализации массива, вам придется сделать это самостоятельно как часть сеттера.