【问题标题】:Multidimensional array OutOfBondsException in JavaJava中的多维数组OutOfBondsException
【发布时间】:2016-09-07 13:57:07
【问题描述】:

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

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。

【问题讨论】:

  • 你正在迭代 movies[i][i],它被声明为 int[][] movies = new int[N_MOVIES][F_MOVIES];,而 i &gt;= F_MOVIES 你会得到 ArrayIndexOutOfBoundsException 现在你明白为什么了吗?
  • 是的,但我不知道如何让这个程序按预期工作。

标签: java multidimensional-array indexoutofboundsexception


【解决方案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][1] = movies[i][0]/2; } 基本上,凡有电影[i][i] 的地方都应该替换为电影[i][1]。

我想您应该研究的另一件事是免费租借数量的计算,根据您当前的代码,它只是将电影数量除以 2。但是,根据您的要求,每 2 个租金应该是 1 个.因此,如果租借的电影数量为 2,则免费租金为 1。但是,使用您当前的代码,如果电影数量为 3,则免费租金为 0!所以,免费租金的计算应该使用 N_MOVIES 而不是 F_MOVIES

【讨论】:

    【解决方案2】:

    你的问题出在

        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]。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-06-22
        • 1970-01-01
        • 2018-10-17
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        • 1970-01-01
        • 2011-08-22
        • 2011-02-27
        相关资源
        最近更新 更多