字符串数组返回空值

时间:2019-08-14 06:16:12

标签: java

在下面的代码中,我读取了带有电影列表的文本文件,并使用辅助方法创建了电影列表的String数组。在该方法中,我能够读取和打印文件的每一行。但是,当我尝试遍历main方法中返回的数组时,只会得到“ null”。为什么会这样呢?到目前为止,在我的研究中,我还找不到其他人发布的类似问题。请帮忙。谢谢。

import java.util.Random;
import java.util.Scanner;
import java.io.File;

public class GuessTheMovie {

    public static void main(String[] args) throws Exception {

        try {
            // Create File and Scanner objects
            File file = new File("movies.txt");
            Scanner scanner = new Scanner(file);

            // Create String array to store all movie titles
            List<String> movies = createMoviesArray(scanner);
            for (String movie : movies) {
                System.out.println(movie);
        }
            /*
            String[] movies = createMoviesArray(scanner);
            for (int i = 0; i < movies.length; i++) {
                System.out.println(movies[i]);
            } */

    } catch (Exception e) {
        System.out.println("Could not find file.");
    }

}

////////////////////////// HELPER METHODS ////////////////////////////////////
/*
// Create String array to store all movie titles
private static String[] createMoviesArray(Scanner scanner) {
    int count = 0;
    String[] movies; // = new String[500];
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        System.out.println(count + " : " + line);
        count += 1;
    }
    movies = new String[count];
    return movies;
}*/

private static List<String> createMoviesArray(Scanner scanner) {
    List<String> movies = new ArrayList<>();
    // get line count for the size of the array
    while (scanner.hasNextLine()) {
        movies.add(scanner.nextLine());
    }
    return movies;
}

5 个答案:

答案 0 :(得分:2)

这很正常,因为您没有在数组中放置任何值。

private static String[] createMoviesArray(Scanner scanner) {
    int count = 0;
    String[] movies; // = new String[500];
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        System.out.println(count + " : " + line);
        count += 1;
    }
    movies = new String[count]; // all you do here, is create an array with 'count' spaces, all default values (being null)
    return movies;
}

如果您要像这样工作,您有两个选择(马上就会想到):

  1. 使用一个数组,并在每次读取后创建一个新数组。这非常消耗资源,这意味着:请勿这样做

  2. 由于在读取所有元素之前您不知道元素的数量,因此请使用列表。

    private static List<String> createMoviesArray(Scanner scanner) {
        List<String> movies = new ArrayList<>();
        while (scanner.hasNextLine()) {
            movies.add(scanner.nextLine());
        }
        return movies;
    }
    

答案 1 :(得分:0)

您只需在return方法中的createMoviesArray()之前创建一个新数组。您从不向该数组添加任何内容,因此从该方法返回后该数组为空。在遍历文件之前,应先创建一个新数组。

如果您不知道文件的大小以及文件的行数,则可能应使用具有动态大小的Collection,例如ArrayList

答案 2 :(得分:0)

使用行movies = new String[count];,您将创建一个新的字符串数组。此时,数组将仅包含其中的NULL个值。实际上,您在代码中的任何地方都没有向数组中写入内容。这就是为什么您的主要方法可以正确打印null的原因。

答案 3 :(得分:0)

这是因为您没有将数据添加到Movies数组,而只是对其进行了初始化。

如果要在助手方法的末尾打印电影对象,您会发现它也为空。

我建议使用ArrayList,因为您不知道数组需要多大,它就会变成这样:

import java.util.Random;
import java.util.Scanner;
import java.io.File;

public class GuessTheMovie {

    public static void main(String[] args) throws Exception {

        try {
            // Create File and Scanner objects
            File file = new File("movies.txt");
            Scanner scanner = new Scanner(file);

            // Create String array to store all movie titles
            ArrayList<String> movies = createMoviesArray(scanner); // change this to ArrayList
            for (movie : movies) { // I used a foreach loop
                System.out.println(movie);
            }

    } catch (Exception e) {
        System.out.println("Could not find file.");
    }

}

////////////////////////// HELPER METHODS ////////////////////////////////////

// Create String array to store all movie titles
private static String[] createMoviesArray(Scanner scanner) {
    int count = 0;
    ArrayList<String> movies = new ArrayList<String>(); // change to Array List
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        System.out.println(count + " : " + line);
        count += 1;
        movies.add(line); // Add to end of ArrayList
    }
    return movies;
}

答案 4 :(得分:0)

  

您也可以通过这种方式做同样的事情:-

ORDER BY FIELD