java - 如何在 void 方法中调用多个数组?
问题描述
我被困在如何调用我的方法上。我收到找不到符号 (playerName,battingArray) 错误消息。- 我没有正确调用它吗?- 方法是否设置为正确填充数组?
我什至不确定这是否是最好的方法。
非常感谢任何帮助!
//Import util to accept input
import java.util.Scanner;
public static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
//Assign number of players to variable and call method readNumPlayers
int numPlayers = readNumPlayers();
System.out.println(numPlayers);
//Call readData method
readData(playerName, numPlayers, battingArray);
}//end main
//readNumPlayers method
public static int readNumPlayers() {
System.out.println("Number of players: ");
int numPlayers = input.nextInt();
if (numPlayers <=0) {
System.out.println(" Error- Try again ");
System.out.println("Number of players: ");
numPlayers = input.nextInt();
}//end catch to ensure entry is positive integer
return numPlayers; //return
}//end readNumPlayers
//readData method
public static void readData(String[] playerName, int numPlayers,
double[] battingArray) {
playerName = new String[numPlayers];
System.out.println("Enter player's last name: ");
for (int i = 0; i < playerName.length; i++) {
playerName[i] = input.next();
} //end for loop
battingArray = new double[numPlayers];
System.out.println("Enter player's batting average: ");
for (int i = 0; i < battingArray.length; i++) {
battingArray[i] = input.nextDouble();
}// end for loop
}//end readData
}
解决方案
当您将数组作为参数传递时,调用者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)
推荐阅读
- scala - 将数据帧缓存为临时视图('createOrReplaceTempView')时的 Spark 2.3 回归(vs 1.6)
- neo4j - SailsJS:添加第二个数据库适配器?
- c# - C# 检测最大值并列出所有获取的元素
- php - $file->isValid() 在 laravel 4.2 中返回 false
- javascript - 防止在使用 ajax 分页导航时将上一页 CSS 应用到下一页
- objective-c - FSEventStreamCreateRelativeToDevice:如何获取 deviceID 的根文件夹?
- c# - 如何解决“已经有一个打开的数据阅读器与此连接关联”
- python - SQLAlchemy:禁用延迟加载并仅在 join() 上加载对象
- behat - 如何在 Behat / Mink 中从测试用例/场景中分离数据
- python - 不明白这个“SQL 语句没有足够的参数”错误