Когда вы передаете массивы в качестве параметров, вызывающий readData
предоставляет ссылки на массивы для заполнения, и, пока вы можете влиять на содержимое массива, на который ссылаютсяВы не можете изменить саму ссылку - поэтому вы не должны выделять массивы в вашем методе - например, ваша строка:
battingArray = new double[numPlayers];
Когда вы выделяете новый массив и заполняете его, вызывающая сторонане имеет доступа к этому массиву, и вы не поместили ничего в массив, который передал вызывающий (и имеет доступ к нему). Просто используйте параметр double[] battingArray
, в который передал вызывающий.
Вот две версии очень простого примера;в первом метод readData
выделяет свой собственный массив и заполняет его. Вы увидите, что когда main
печатает содержимое массива, вы получаете null
, потому что массив, заполненный readData, не тот массив, который был передан.
Во втором readData просто помещает значения в массив, который передал вызывающий.
Первый:
import java.util.Scanner;
class Main
{
public static void main(String[] args)
{
int count = 2;
String[] names = new String[count];
double[] avgs = new double[count];
readData(names, avgs, count);
System.out.println("names[0] in main: " + names[0]);
}
public static void readData(
String[] playerNames,
double[] battingAvg,
int numPlayers
)
{
Scanner in = new Scanner(System.in);
// allocating a new array
String[] playerNames2 = new String[numPlayers];
for (int i = 0; i < numPlayers; i++)
{
System.out.print("Players name: ");
String line = in.nextLine();
// putting the value into the newly allocated array
playerNames2[i] = line.trim();
}
System.out.println("playerNames2[0] in readData: " + playerNames2[0]);
}
}
Второй:
import java.util.Scanner;
class Main
{
public static void main(String[] args)
{
int count = 2;
String[] names = new String[count];
double[] avgs = new double[count];
readData(names, avgs, count);
System.out.println("names[0] in main: " + names[0]);
}
public static void readData(
String[] playerNames,
double[] battingAvg,
int numPlayers
)
{
Scanner in = new Scanner(System.in);
// no array allocated this time
for (int i = 0; i < numPlayers; i++)
{
System.out.print("Players name: ");
String line = in.nextLine();
// put the value into the array that was passed
playerNames[i] = line.trim();
}
System.out.println("playerNames[0] in readData: " + playerNames[0]);
}
}
Так как вызывающая сторона говорит вам, насколько большие массивы (параметр numPlayers
), скажем, «10», если массивы вызывающей стороны на самом деле недостаточно велики (скажем, они сделали new String[5]
), возможно, вы получите ArrayIndexOutOfBoundsException
, поэтому readData
, вероятно, захочет перехватить это и вернуться без завершения цикла.
(я создал Java repl , где вы можете увидеть версию 2)