Исключение выхода за пределы в java коде, нужна помощь (начальный уровень) - PullRequest
0 голосов
/ 16 марта 2020
package hr.java.vjezbe.glavna;

import java.math.BigDecimal;
import java.util.Scanner;

import hr.java.vjezbe.entitet.Artikli;
import hr.java.vjezbe.entitet.Kategorija;
import hr.java.vjezbe.entitet.Korisnik;

public class Glavna {

    private static final int BROJ_KORISNIKA = 3;
    private static final int BROJ_KATEGORIJA = 3;
    private static int n;

    public static void main(String[] args) {

        Scanner skener = new Scanner(System.in);

        Korisnik[] korisnici = new Korisnik[BROJ_KORISNIKA];
        Kategorija[] kategorije = new Kategorija[BROJ_KATEGORIJA];
        Artikli[] artikli = new Artikli[n];

        for (int i = 0; i < BROJ_KORISNIKA; i++) {
            System.out.println("Unesite " + (i + 1) + ". korisnika:");
            System.out.print("Unesite ime >> ");
            String ime = skener.nextLine();
            System.out.print("Unesite prezime >> ");
            String prezime = skener.nextLine();
            System.out.print("Unesite E-mail >> ");
            String email = skener.nextLine();
            System.out.print("Unesite broj telefona >> ");
            String telefon = skener.nextLine();

            korisnici[i] = new Korisnik(ime, prezime, email, telefon);

        }

        for (int i = 0; i < BROJ_KATEGORIJA; i++) {
            System.out.println("Unesite naziv " + (i + 1) + ". kategorije: ");
            String naziv = skener.nextLine();
            System.out.print("Unesite broj artikala za tu kategoriju >> ");
            n = skener.nextInt();
            skener.nextLine();
            int counter = 0;
            do {
                System.out.print("Unesite naslov artikla >> ");
                String naslov = skener.nextLine();
                System.out.print("Unesite opis artikla >> ");
                String opis = skener.nextLine();
                System.out.print("Unesite cijenu artikla (sa zarezom) >> ");
                BigDecimal cijena = skener.nextBigDecimal();
                skener.nextLine();
                artikli[n] = new Artikli(naslov, opis, cijena);
                counter++;
            } while (counter < n);

            kategorije[i]= new Kategorija(naziv, artikli);

        }
        skener.close();
    }

}

У меня проблема с моим кодом, когда он выдает исключение за пределами границ после того, как я ввел цену, которая называется cijena. Я не знаю, в чем проблема, код должен попросить пользователя ввести количество категорий, а затем заставить его ввести его и сохранить их в массив, а после этого сохранить этот массив в другой под названием kategorije. Любая помощь приветствуется и совет.

Ответы [ 3 ]

0 голосов
/ 16 марта 2020
n = skener.nextInt();

В этой строке вы принимаете значение int через ваш ввод. Скажем 5; Итак, n = 5;

В этой строке =>

artikli[n] = new Artikli(naslov, opis, cijena);

вы пытаетесь получить доступ к индексу artikli [5], однако размер вашего массива равен 0. Вы инициировали перед этим массивом с n = 0, поскольку вы не инициализировали 'n', неинициализированная переменная int будет по умолчанию 0 =>

private static int n; //which is 0 by dafault

Artikli[] artikli = new Artikli[n]; // creates an array named artikli of size 0

сначала вам нужно инициализировать массив до соответствующего размера, затем вы сможете получить доступ ваш индекс Artikli [n].

Быстрое решение:

replace ->  Artikli[] artikli = new Artikli[n];
with this-> Artikli[] artikli = new Artikli[1000]; 

при условии, что ваш ввод int будет меньше 1000, чтобы вы могли получить доступ к индексу artikli [от 0 до 999]

Я пытался объяснить как можно более подробно. Если у вас возникли какие-либо сомнения, прокомментируйте.

0 голосов
/ 21 марта 2020

Вы не объявили значение n. Вы должны указать это, потому что список практически не может быть 0. Сделайте что-то вроде этого:

private static int n = 3;


artikli[n] = new Artikli(naslov, opis, cijena);

Ошибка, потому что список меньше, чем значения, которые вы хотите дать ему

Если это Помогите, пожалуйста, проголосуйте за меня. Я здесь новичок и хочу иметь базовую репутацию. Спасибо! ?

0 голосов
/ 16 марта 2020

Ваш массив artikli[] инициализируется с начальным размером 0 , так как это значение переменной n в начале вашей программы (int переменные инициализируются по умолчанию 0 value).

Вы можете удалить этот инициализатор, даже если он не причиняет вреда ...

Artikli[] artikli = new Artikli[n];

... и позволить ему просто объявить:

Artikli[] artikli;

и поместите это в свой второй l oop, чтобы фактически инициализировать его с вашим желаемым размером:

    for (int i = 0; i < BROJ_KATEGORIJA; i++) {
        System.out.println("Unesite naziv " + (i + 1) + ". kategorije: ");
        String naziv = skener.nextLine();
        System.out.print("Unesite broj artikala za tu kategoriju >> ");
        n = skener.nextInt();

        //initialize it properly now:
        artikli = new Artikli[n];

        skener.nextLine();
        int counter = 0;
        (...)
...