线程“主”中的异常java.lang.IndexOutOfBoundsException:

时间:2018-08-07 15:31:58

标签: java

程序使用以下方法:

  1. 获取用于计算平均值的数字,

  2. 在计算

  3. 之前获取要下降的最低数字的数量
  4. 获取权重,即大于0且小于或等于1的double值。

  5. 计算用户输入的数字(最低的n个数字除外)的加权平均值,并且

  6. 打印结果。

第一个方法应不带参数,并返回双精度数组列表。

第二种方法应该不带任何参数,并返回一个整数,即在计算平均值之前要减去的最低数字。

第三个方法应不带任何参数并返回双精度(权重)

第四个方法应带有三个参数:数字数组列表(上述第一个方法的返回值);整数(计算平均值之前要减少的最小项目数);和一倍(重量)。此方法应返回一个double(除最低的n值以外,所有数字的加权平均值)。

第五种方法应采用四个参数:一个数字数组列表(上述第一种方法的返回值);整数(计算平均值之前要减少的最小数字的数量);两倍(重量);和双精度数(上述第四种方法返回的加权平均值)。此方法应该没有返回值。

例如:

如果用户提供这些数字以计算平均值:

40 60 80 100 20

,用户给出数字2表示在计算平均值之前应降低多少最低值,并赋予权重0.5,然后程序应给出输出:

当使用数据40.0、60.0、80.0、100.0、20.0时,数字的加权平均值为40.0,其中0.5是所使用的权重,并且平均值在减去最低的2个值之后计算得出。

import java.util.*;
import java.lang.*;
import java.util.ArrayList;
import java.util.Collections;


public class MyClass 
{
    public static ArrayList<Double> getALInfo() 
    {
        Scanner in=new Scanner(System.in);
        ArrayList<Double> inputs = new ArrayList<>();
        System.out.println("Please enter 5 - 10 integers, Q to quit: ");

        String [] tokens = in.nextLine().split("\\s");

        for (int i = 0; i < tokens.length; i++)
            inputs.add(Double.parseDouble(tokens[i]));

        return inputs;
    }   

    public static int getLowestnum() 
    {        
        int lowNum = 0;
        System.out.println("How many of the lowest values should be dropped? ");
        Scanner in = new Scanner(System.in);
        lowNum = in.nextInt();

        return lowNum;

    }
    public static double weight() 
    {
        Scanner in = new Scanner(System.in);
        System.out.println("Enter the weight: ");
        double weight = in.nextDouble();

        return weight;
    }

    public static double calculateAvg(ArrayList<Double> inputs,double weight, int lowNum) 
    {
        double sum = 0;
        double average = 0;                

        Collections.sort(inputs);
        ArrayList<Double> inputs1 = new ArrayList<Double>(inputs.subList(lowNum, inputs.size()+1));

        for (int i = 0; i < inputs1.size(); i++) 
        {
            if (inputs1.get(i) > lowNum) 
            {
                sum = sum + inputs.get(i);
            }
        }
        sum=weight*sum;
        average = (sum / inputs1.size());

       return average;
    }

    public static void getAvg(ArrayList<Double> inputs,int n,double weight, double average) 
    {

        System.out.println("The weighted average of the numbers is " + average + ", when using the data " + inputs + " where " +weight+ " is the weight used, and the average is computed after dropping the lowest " +n+" values");  
    }

    public static void main(String args[]) 
    {
        int lowNum = 0;  
        double average; 
        double weight=0;
        ArrayList<Double> inputs= getALInfo();
        lowNum = getLowestnum();
        weight=weight();
        average = calculateAvg(inputs,weight, lowNum);
        getAvg(inputs, lowNum,weight, average);
    }
}

程序运行正常,直到您输入权重,它就会显示数组越界异常错误。您能指出我哪里出问题了吗?

2 个答案:

答案 0 :(得分:2)

错误来自new ArrayList<Double>(inputs.subList(lowNum, inputs.size()+1))

因为您尝试到达最后一个元素+1作为结束索引,所以它不存在


解决:

new ArrayList<Double>(inputs.subList(lowNum, inputs.size()))

!! 另外,您的for loop是错误的

  • 不需要与这个奇怪的事物核对
  • 您没有从正确的列表中接听:使用更好的名字
for (int i = 0; i < inputs1.size(); i++) {
    if (inputs1.get(i) > lowNum) {
        sum = sum + inputs.get(i);
    }
}

解决

ArrayList<Double> subList = new ArrayList<>(inputs.subList(lowNum, inputs.size()));
for (int i = 0; i < subList.size(); i++) {           
    sum = sum + inputs.get(i);            
}

答案 1 :(得分:1)

此行

@Id
@Column(name="QuestionId", nullable=false)
private long questionId;

@Column(name="QuestionList", nullable=false)
private String question;

@Column(name="TimeAsked", nullable=false)
private Date timeAsked;


@ManyToOne(optional = false)
@JoinColumn(name = "Email_ID" )
private RealUser realUser;

应该是

        sum = sum + inputs.get(i);