Как использовать конструктор для установки других полей, которые не находятся внутри конструктора - PullRequest
0 голосов
/ 06 мая 2019

Я угадываю игру в кино, в которой я беру список фильмов из текстового файла.У меня есть два класса Game для получения случайного фильма и Main для остальной части игры.Теперь я подумал о добавлении выбора для голливудских или болливудских фильмов, изменив текстовые файлы в Game.Я беру 'h' или 'b' соответственно в качестве входных данных.Я вызываю конструктор Game с параметрами для выбора файла соответственно, но он не работает, и ВСЕГДА файл имеет значение null и показывает NullPointerException.

Это изображение, показывающее, что происходит во время отладки,Он пропускает setMovieList и конструктор и переходит к следующей строке

РЕДАКТИРОВАТЬ: я новичок в ООП, поэтому, пожалуйста, потерпите меня.Я только что увидел во время отладки, что отладчик сначала переходит к полям класса, а ТО к конструктору, я на самом деле пытался использовать file (который находится внутри конструктора) для инициализации других полей, из-за чего его значение было null и показывал NullPointerException.

Теперь у меня действительно остается вопрос, как использовать file и noOfMovies для инициализации других полей в Game.

              //showing the setter method that i tried
//Main class
/*only showing the part having Game class*/

//making an object of Game class to get a random movie from the file
    System.out.println("Enter 'h' for hollywood and 'b' for bollywood ");
    Scanner input = new Scanner(System.in);
    char genre = input.next().charAt(0);
    Game newGame = new Game(genre);


//Game class
public class Game
{

    public Game(char genre)
    {
        setMovieList(genre);
    }
    File file;
    int noOfMovies;

    public void setMovieList(char genre)
    {
        if(genre == 'h')
        {
            this.file = new File("C:\\Users\\Rashim\\Desktop\\java\\GuessTheMovie\\src\\hollywoodMovies.txt");
            this.noOfMovies = 30;
        }
        else if(genre == 'b')
        {
            this.file = new File("C:\\Users\\Rashim\\Desktop\\java\\GuessTheMovie\\src\\bollywoodMovies.txt");
            this.noOfMovies = 20;
        }

    // EDIT ------> I want to initialize the below fields <-------

        private Scanner scan = new Scanner(this.file);

        private int lineCount = 0;
        int random = (int)(Math.random()*noOfMovies)+1;

        //array for storing the movie titles
        private String[] movieArray = new String[noOfMovies];


    }




Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Я не уверен ... может быть, вы хотите получить такой результат:

ИГРОВОЙ КЛАСС

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class Game {

    private File file = null;
    //private int noOfMovies = 0;
    private List<String> movies= null;
    FileInputStream read = null;

public Game(char genre) {
     movies = getMovieList();
     System.out.println(movies);
}

public void setMovieList(char genre) {
    if (genre == 'h') {
        this.file = new File("C:\\Users\\Rashim\\Desktop\\java\\GuessTheMovie\\src\\hollywoodMovies.txt");
      //  this.noOfMovies = 30;
    } else if (genre == 'b') {
        this.file = new File("C:\\Users\\Rashim\\Desktop\\java\\GuessTheMovie\\src\\bollywoodMovies.txt");
      //  this.noOfMovies = 20;
    }

}

public List<String> getList() {
    List<String> movieList = new ArrayList<>();
    String[] values = null;
    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
        String line;
        while ((line = br.readLine()) != null) {
            values = line.split(";");
            movieList.add(values[0]);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return movieList;
}

public String getMovie(){
    System.out.println(movies.size());
    int min = 1;
    int max = movies.size();
    int random = min + (int) (Math.random() * (max - min));

    System.out.println(random);
    String title = movies.get(random);
    return title;
 }

}

ГЛАВНЫЙ КЛАСС

import java.util.Scanner;

public class Main {

  public static void main(String[] args) {

    System.out.println("Enter 'h' for hollywood and 'b' for bollywood ");
    Scanner input = new Scanner(System.in);
    char genre = input.next().charAt(0);
    Game newGame = new Game(genre);

    String randomMovie = newGame.getMovie();
    System.out.println(randomMovie);
 }
}

Обратите внимание, что я использовал структуру данных List вместо массива, но это, очевидно, зависит от вас ... дайте мне знать, если это может выглядеть так, как вы пытаетесь сделать ... некоторые другие улучшения, безусловно, могут быть сделаны, но должно работать.

Также предполагается, что у вас есть текстовый файл с заголовками фильмов, разделенными точкой с запятой ... в противном случае вам нужно настроить метод split в getList.

Более того, таким образом вам больше не нужно поле noOfMovies, потому что оно автоматически принимает размер списка.

Надеюсь, это поможет ...

0 голосов
/ 07 мая 2019

Проблема в том, что поля инициализируются до вызова конструктора.

Есть несколько вещей, которые вы должны сделать:

  1. Не вызывать методы получения и установки из конструктора. Смотрите этот вопрос: Должен ли я использовать геттеры и сеттеры в конструкторах?

  2. Если вы выполняете сложную логику инициализации, сделайте все это в конструкторе. Инициализируйте поля непосредственно с очень базовыми значениями (не те, которые зависят от других полей). В вашем случае будет проще сделать все в конструкторе. Это позволяет избежать проблемы, связанной с изменением кода для изменения значения в конструкторе, и инициализация некоторых полей перестает работать.

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