首页 > 解决方案 > 如何在 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

}

标签: javaarraysmethods

解决方案


当您将数组作为参数传递时,调用者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)


推荐阅读