【问题标题】:java.lang.ArrayIndexOutOfBoundsException: 19 [duplicate]java.lang.ArrayIndexOutOfBoundsException:19 [重复]
【发布时间】:2017-10-18 08:06:11
【问题描述】:

下面的代码用于可视化程序其余部分生成的数据的打印输出。它从输入到arraylist中的wagens和locos中取出信息。

我主要关心的是如何以正确的顺序组合它们并让它们以正确的顺序打印出来。

这就是我的问题所在。我收到了一个

arrayoutofbound 异常:19

在我的打印整数数组上。

  1. 我不知道自己做错了什么。
  2. 我正在创建和实例化我的数组打印 0 - 19 个位置(需要 20 个)。
  3. 我正在用 setDataPrint 中的数据填充插槽,这些数据由其他 2 个数组输入的数据组成。一个位置为 数据应该去哪里,另一个是实际数字 需要。
  4. 我添加来自setTotalInPrint()的最终数据。

  5. 然后我打印出schrijfData()的数据

任何帮助将不胜感激。

import java.util.ArrayList;

/**
 * Verzameling van alle gegevens voor het weergeven van de remmings bulletin
 *
 * @author Pieter-Jan Casteels
 * @version 2017-05-17
 */
public class Bulletin
{
    // Collection of the data
    private int[] print;

    // Totalen
    private int totaalAantal;
    private int totaalAfgezonderdeRem;
    private int totaalLengteInM;
    private int totaalMassa;
    private int totaalRemming;

    // Percentage
    private int percentageRemming;
    private int vereisteMassaRemming;
    private int vereisteRemmingPercentage;

    /**
     * Basic constructor
     */
    public Bulletin()
    {
        System.out.println("Kan niet gegenereerd worden zonder Trein classe");
    }

    /**
     * Full constructor voor de Bulletin classe
     * 
     * @param Trein de huidige trein
     */
    public Bulletin(Trein newTrein)
    {
        setPrint();
        setTotaalAantal(0);
        setAfgezonderdeRem(0);
        setTotaalLengteInM(0);
        setTotaalMassa(0);
        setTotaalRemming(0);
        setPercentageRemming(0);
        setVereisteMassaRemming(0);
        setVereisteRemmingPercentage(50);
        berekenLocoEnWagen(newTrein);
        remmingsPercentage();
        vereisteGeremdeMassa();
        setTotaalInPrint();
        schrijfData(print);
    }

    // Setters en Getters

    /**
     * Roep de classe aan voor het berekenen van de loco en wagen
     * Geef hier de arraylist aan mee
     */
    private void berekenLocoEnWagen(Trein newTrein)
    {
        berekeningLocos(newTrein.getLocos());
        berekeningWagens(newTrein.getWagens());
    }

    /**
     * Setter voor de array met gegevens die geprint moet worden
     */
    private void setPrint()
    {
        print = new int[19];
    }

    /**
     * De totaal optelling van de lengte van de trein
     * 
     * @param intiger de lengte in meter
     */
    private void setTotaalLengteInM(int value)
    {
        if(value >= 0)
        {
            totaalLengteInM += value;
        }
    }

    /**
     * De totaal optelling van de aantallen
     * 
     * @param intiger de aantallen
     */
    private void setTotaalAantal(int value)
    {
        if(value >= 0)
        {
            totaalAantal += value;
        }
    }

    /**
     * Het totaal afgezonderde remmen
     */
    private void setAfgezonderdeRem(int value)
    {
        if(value >= 0)
        {
            totaalAfgezonderdeRem += value;
        }
    }

    /**
     * De totaal optelling van de massas
     * 
     * @param intiger de massas
     */
    private void setTotaalMassa(int value)
    {
        if(value >= 0)
        {
            totaalMassa += value;
        }
    }

    /**
     * De totaal optelling van de remming
     * 
     * @param intiger de Remming
     */
    private void setTotaalRemming(int value)
    {
        if(value >= 0)
        {
            totaalRemming += value;
        }
    }

    /**
     * De weergave voor het percentage remming
     * 
     * @param intiger de Remming
     */
    private void setPercentageRemming(int value)
    {
        if(value >= 0)
        {
            percentageRemming += value;
        }
    }

    /**
     * De vereiste geremde massa
     */
    private void setVereisteMassaRemming(int value)
    {
        if(value >= 0)
        {
            vereisteMassaRemming += value;
        }
    }

    /**
     * De vereiste percentage voor remming
     */
    private void setVereisteRemmingPercentage(int value)
    {
        if(value >= 0)
        {
            vereisteRemmingPercentage += value;
        }
    }

    // Methodes

    /**
     * De verzameling van gegevens voor de locomotief weergave in de bulletin
     * Verzamel de gegevens per locomotief en plaats ze in de locale variabelen
     * Roep de setters aan voor de optellingen van de totalen
     */
    private void berekeningLocos(ArrayList<Loco> locos)
    {
        if(!locos.isEmpty())
        {
            // Aantal
            int sleepAantal = 0;
            int voertuigAantal = 0;

            // Lengte
            int sleepLengteDM = 0;
            int voertuigLengteDM = 0;
            int sleepInM = 0;
            int voertuigInM = 0;

            // Massa
            int sleepMassa = 0;
            int voertuigMassa = 0;

            // Remming
            int sleepRemming = 0;
            int voertuigRemming = 0;

            for(Loco loco : locos)
            {
                if(!loco.getAlsVoertuig())
                {
                    sleepAantal++;
                    sleepLengteDM += loco.getLengteDM();
                    sleepMassa += loco.getTotalMassa();
                    sleepRemming += loco.getRemming();
                }
                else
                {
                    voertuigAantal++;
                    voertuigLengteDM += loco.getLengteDM();
                    voertuigMassa += loco.getTotalMassa();
                    voertuigRemming += loco.getRemming();
                }

                if(loco.getAfgzRem())
                {
                    setAfgezonderdeRem(1);
                }
            }
            setTotaalAantal(locos.size());
            sleepInM = afrondenLengteInM(sleepLengteDM);
            setTotaalLengteInM(sleepInM);
            voertuigInM = afrondenLengteInM(voertuigLengteDM);
            setTotaalLengteInM(voertuigInM);
            setTotaalMassa(sleepMassa);
            setTotaalMassa(voertuigMassa);
            setTotaalRemming(sleepRemming);
            setTotaalRemming(voertuigRemming);

            int[] loc = {0, 1, 5, 6, 9, 10, 13, 14};
            int[] data = {sleepAantal, voertuigAantal, sleepInM, voertuigInM, sleepMassa, voertuigMassa, sleepRemming, voertuigRemming};
            setDataPrint(loc, data);
        }
        else
        {
            System.out.println("Zonder locomotief geen trein");
        }
    }

    /**
     * Input the data into the print array at location
     * 
     * @param int array loc, this is the location
     * @param int array data, this is the data for the location
     */
    private void setDataPrint(int[] loc, int[] data)
    {
        for(int i = 0; i < loc.length ; i++)
        {
            print[loc[i]] = data[i];
        }
    }

    /**
     * De verzameling van gegevens voor de wagen weergave in de bulletin
     * Verzamel de gegevens per wagen en plaats ze in de locale variabelen
     * Roep de setters aan voor de optellingen van de totalen
     */
    private void berekeningWagens(ArrayList<Wagen> wagens)
    {
        // Aantal
        int wagensAantal = wagens.size();

        // Lengte
        int voertuigLengteDM = 0;
        int voertuigInM = 0;

        // Massa
        int voertuigMassa = 0;

        // Remming
        int voertuigRemming = 0;

        for(Wagen wagen : wagens)
        {
            voertuigLengteDM += wagen.getLengteDM();
            voertuigRemming += wagen.getRemming();
            if(wagen.getAfgzRem())
            {
                setAfgezonderdeRem(1);
            }
        }
        setTotaalAantal(wagensAantal);
        voertuigInM = afrondenLengteInM(voertuigLengteDM);
        setTotaalLengteInM(voertuigInM);
        setTotaalMassa(voertuigMassa);
        setTotaalRemming(voertuigRemming);

        int[] loc = {2, 7, 11, 15};
        int[] data = {wagensAantal, voertuigInM, voertuigMassa, voertuigRemming};
        setDataPrint(loc, data);
    }

    /**
     * Afronden lengtes naar boven lengte naar meters
     */
    private int afrondenLengteInM(int totaalDM)
    {
        return (totaalDM + 9) / 10;
    }

    /**
     * Berekening remmings percentage van de trein
     * Afgerond naar beneden.
     */
    private void remmingsPercentage()
    {
        percentageRemming = (totaalRemming * 100) / totaalMassa;
    }

    /**
     * Vereiste Geremde Remming
     */
    private void vereisteGeremdeMassa()
    {
        vereisteMassaRemming = (vereisteRemmingPercentage * totaalMassa) / 100;
    }

    /**
     * Zet al de totaals in de print array
     */
    private void setTotaalInPrint()
    {
        int[] loc = {3, 4, 8, 12, 16, 17, 18, 19};
        int[] data = {totaalAantal, totaalAfgezonderdeRem, totaalLengteInM, totaalMassa, totaalRemming, percentageRemming, vereisteMassaRemming, vereisteRemmingPercentage};
        setDataPrint(loc, data);
    }

    /**
     * Print de data aan de hand van de print array
     */
    private void schrijfData(int[] print)
    {
        System.out.println("21 AANTAL");
        System.out.println("21.1 Sleeplocomotief(ven): " + print[0]);
        System.out.println("21.2 Loc als voertuig(en): " + print[1]);
        System.out.println("21.3 Andere voertuigen: " + print[2]);
        System.out.println("21.4 TOTAAL TREIN: " + print[3]);
        System.out.println("21.5 Voertuig met afgezonderde rem: " + print[4]); // 4

        // Lengte
        System.out.println("22 LENGTE");
        System.out.println("22.1 Sleeplocomotief(ven): " + print[5]);
        System.out.println("22.2 Loc als voertuig(en): " + print[6]);
        System.out.println("22.3 Andere voertuigen: " + print[7]);
        System.out.println("22.4 TOTAAL TREIN: " + print[8]); // 8

        // Massa
        System.out.println("23 MASSA");
        System.out.println("23.1 Sleeplocomotief(ven): " + print[9]);
        System.out.println("23.2 Loc als voertuig(en): " + print[10]);
        System.out.println("23.3 Andere voertuigen: " + print[11]);
        System.out.println("23.4 TOTAAL TREIN: " + print[12]); // 12

        // Remming
        System.out.println("24 WERKELIJKE GEREMDE MASSA");
        System.out.println("24.1 Sleeplocomotief(ven): " + print[13]);
        System.out.println("24.2 Loc als voertuig(en): " + print[14]);
        System.out.println("24.3 Andere voertuigen: " + print[15]);
        System.out.println("24.4 TOTAAL GEREMDE MASSA");
        System.out.println("24.41 Tonnage: " + print[16]);
        System.out.println("24.42 Percentage: " + print[17]); // 17

        // Vereiste remming
        System.out.println("25 VEREISTE GEREMDE MASSA");
        System.out.println("25.1 Tonnage: " + print[18]);
        System.out.println("25.2 Percentage: " + print[19]); // 19
    }
}

【问题讨论】:

  • 你需要隔离你的错误来自哪里,很难为一个错误调试整个程序。
  • 你说你需要 20 个条目,但是你创建了一个长度为 19 的数组:print = new int[19];。因此,当您尝试访问索引 19 处的第 20 个元素时,您位于数组之外,因此您会遇到异常。一般来说,当一次处理多个数组时(例如从一个复制到另一个),您应该确保它们具有相同的长度,如果您的代码不能确定它应该检查并处理它。
  • print = new int[19] 定义数组索引0..18print[19] 越界。试试print = new int[20]

标签: java arrays sorting indexoutofboundsexception


【解决方案1】:

这就是原因,您正在创建一个有 19 个位置 (0-18) 的打印,您不能使用 19

 private void setPrint()
    {
        print = new int[19];
    }

解决办法:

 private void setPrint()
        {
            print = new int[20];
        }

【讨论】:

  • 好的,我之前试过但可能忘记编译了。它确实有效。不过我确实觉得有点奇怪。当您从值 0 开始数组时,我的最终值为 19。
  • 其实这并不奇怪,因为如果你计算位置的数量(0-19)你会得到你在初始化中声明的20
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多