Как вызвать несколько массивов в пустом методе? - PullRequest
0 голосов
/ 18 марта 2019

Я застрял на том, как вызвать мой метод. Я получаю сообщение об ошибке "Найти символы (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

}

1 Ответ

0 голосов
/ 18 марта 2019

Когда вы передаете массивы в качестве параметров, вызывающий 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...