繁体   English   中英

Java中的多维数组OutOfBondsException

[英]Multidimensional array OutOfBondsException in Java

我在这段代码中遇到了一些问题。 我需要:询问姓名和客户上个月租借的电影的数量。 第一列用于名称的数组,第二列用于上个月租借的电影数量的二维数组,第二列则用于客户获得的免费租金数量(两次租金后,客户获得免费的租金)。 向客户显示最大数量的免费租金以及这个数字是多少。

import java.util.Scanner;
public class RentalStore
{
    public static final int NAMES = 10; //ten clients
    public static final int N_MOVIES = 10; //column with movies per client
    public static final int F_MOVIES = 2; //is granted free movie rentals.

    public static void ClientRegistration(String[] names, int[][] movies) {
        Scanner sc = new Scanner (System.in);
        for(int i=0; i< NAMES; i++) {
            System.out.println("Type the name of the client " + i + " and the amount of movies: ");
            names[i] = sc.next();
            movies[i][0] = sc.nextInt();
        }

        for(int i=0; i<F_MOVIES; i++) {
            movies[i][i] = movies[i][0]/2;
        }
    }

    public static void main (String [] args) {
        String[] names = new String[NAMES];
        int[][] movies = new int[N_MOVIES][F_MOVIES];
        Scanner sc = new Scanner (System.in);

        ClientRegistration(names,movies);

        int largest = 0;
        for(int i=0; i<F_MOVIES; i++) {
            if(movies[i][i] > largest) {
                largest = movies[i][i];
            }

        }
        for(int i=0; i<F_MOVIES; i++) {
            if(movies[i][i] == largest) {
                System.out.println("The client " + names[i] + " is entitled to " + largest + " movies.");
            }
        }
    }
}

第二列将存储客户的免费租金数量。 但是,如果我将F_MOVIES更改为N_MOVIES,则会得到ArrayIndexOutOfBoundsException。

将多维数组视为网格是最容易的。 你有:

                    F_MOVIES
  N_MOVIES         0       1  
    0              []      []
    1              []      []
    2              []      []
    3              []      []
    4              []      []
    5              []      []
    6              []      []
    7              []      []
    8              []      []
    9              []      []

将F_Movies设置为N_MOVIES会超出范围,因为F_MOVIES不能超过索引1

我认为您应该更改的第一件事是:
for(int i=0; i<F_MOVIES; i++) { movies[i][i] = movies[i][0]/2; } for(int i=0; i<F_MOVIES; i++) { movies[i][i] = movies[i][0]/2; }for(int i=0; i<F_MOVIES; i++) { movies[i][1] = movies[i][0]/2; } for(int i=0; i<F_MOVIES; i++) { movies[i][1] = movies[i][0]/2; }基本上,无论您有电影[i] [i]的地方,都应替换为电影[i] [1]。

我猜您应该考虑的另一件事是免费租赁数量的计算,根据您当前的代码,该方法只是将电影数量除以2。但是,根据您的要求,每2租金应为1。 因此,如果租借的电影数量为2,则免费租金为1。但是,使用您当前的代码,如果租借的电影数量为3,则免费租金变为0! 因此,免费租金的计算应使用N_MOVIES而不是F_MOVIES

你的问题在于

    for(int i=0; i<F_MOVIES; i++) {
        movies[i][i] = movies[i][0]/2; //change to movies[i][1]
    }

在N_MOVIES上进行迭代时,由于电影被定义为[N_MOVIES] [F_MOVIES],因此您将越界。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM