java代码中超出范围的异常,需要帮助(入门)

问题描述 投票:0回答:3
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的数组中。任何帮助都是很好的建议。

java exception indexoutofboundsexception
3个回答
0
投票

您的artikli[]数组用初始大小为0初始化,因为它是程序开始时n变量上的值(int变量使用默认的0值初始化) 。

您可以删除该初始化程序,即使它不会造成伤害...

Artikli[] artikli = new Artikli[n];

...让它刚刚声明:

Artikli[] artikli;

并将其放入您的第二个循环中,以便实际以所需的大小对其进行初始化:

    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;
        (...)

0
投票
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
投票

您尚未声明n的值。您必须指定它,因为数组列表不能为0。做这样的事情:private static in n = 4;

© www.soinside.com 2019 - 2024. All rights reserved.