所以我正在为这次降雨分配写一个班级,我想我可以让它工作但是我遇到了程序最后一部分的问题“Rainfall rain = new Rainfall();”。
我知道到目前为止我的代码中可能存在一些逻辑错误,但我正专注于尝试至少将其打印出来以便我可以解决这些问题。谢谢!
/**
Rainfall.java calculated the total annual and average
monthly rainfall from the array. This program also returns
the month with the most rainfall and the month with the least rainfall.
*/
public class Rainfall
{
//set integer month to 12
private int month = 12;
private double[] months;
/**
Constructor
@param scoreArray An array of test scores
*/
public Rainfall(double[] rainfallArray)
{
months = rainfallArray;
}
//Get total annual rainfall
public double getTotal()
{
double total = 0;
//for loop to go through the entire array to calculate the total amount of rainfall
for (int i = 0; i < month; i++)
{
total = total + months[i];
}
return total;
}
//Calculate average monthly rainfall
public double getAverage()
{
double total = 0; //To hold the current total amount of rainfall
double average; //To hold the average amount of rainfall
for (int i = 0; i < month; i++)
{
total = total + months[i];
}
//Calculate average rainfall
average = total / (months.length + 1);
return average;
}
//Get month with the most rain
public double getMost()
{
double most; //To hold the most amount of rainfall
//set the first month in the array
most = months[0];
int m=0;
for (int i = 0; i < month; i++)
{
if (months[i] < most)
{
m=i;
}
}
return most;
}
//Get month with the least rain
public double getLeast()
{
double least; //To hold the least amount of rainfall
int m=0;
//set the first month in the array
least = months[0];
for (int i = 0; i < month; i++)
{
if (months[i] < least)
{
m = i;
}
}
return least;
}
public static void main(String[ ] args)
{
Rainfall rain = new Rainfall();
rain.setMonths();
//Display results of the Total, Avg, and Most and Least calculations of rainfall
System.out.println("The total rainfall for the year: " + rain.getTotal());
System.out.println("The average rainfall for the year: " + rain.getAverage());
System.out.println("The month with most rain: " + rain.getMost());
System.out.println("The month with least rain: " + rain.getLeast());
}
}
答案 0 :(得分:3)
更改构造函数以使用varargs参数:
public Rainfall(double... rainfallArray) {
months = rainfallArray; // a varargs comes in as an array, ie double[]
}
然后当你构造它时,你可以传递任意数量的doubles
(包括无)。
即所有这些都没问题:
Rainfall r1 = new Rainfall();
Rainfall r2 = new Rainfall(4);
Rainfall r3 = new Rainfall(4, 5, 6, 15);
请注意,在没有传递参数的情况下,即new Rainfall()
仍然传入一个数组,但它的长度为零。
如果您想声明传入了特定的月份数,请将其添加到构造函数中:
if (rainfallarray.length != 12)
throw new IllegalArgumentException(
"Expecting 12 months of data, but only got " + rainfallarray.length);
答案 1 :(得分:1)
问题是你的构造函数期望一个名为double array
的{{1}}并且构造函数不包含任何参数;它是空的。用双数组初始化它将构造。
像这样:
rainfallArray
此外,您的double [] rain = {1.3, 2.4, 3.5, 6.2};
Rainfall rain = new Rainfall(rain);
... rest of code in main
应如下所示:
for loops
如果按照以前的方式执行,如果没有大小为12个元素的数组,则会出现空指针异常。另外,请记住,数组是基于0的,因此您希望以1开始for循环,或者如果您使用现在使用的逻辑,则将for (int i = 0; i < months.size(); i++)
{
if (months[i] < most)
{
m=i;
}
}
变量设置为11。
答案 2 :(得分:0)
你的Rainfall类需要数据,你已经在构造函数中决定了(它必须有一个双精度数组)并且当你尝试构造一个没有数据的Rainfall对象时你违反了自己的规则,因此就是错误。您必须传递一个双精度数组(即使它不包含数据),以使对象以有效状态存在(根据您的规则,构造函数定义)。
所以new Rainfall()
无效。你必须传递一个双数组。
double[] data = new double[12];
//fill in data, do stuff
Rainfall rain = new Rainfall(data);