在下面的代码中,我读取了带有电影列表的文本文件,并使用辅助方法创建了电影列表的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;
}
答案 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;
}
如果您要像这样工作,您有两个选择(马上就会想到):
使用一个数组,并在每次读取后创建一个新数组。这非常消耗资源,这意味着:请勿这样做
由于在读取所有元素之前您不知道元素的数量,因此请使用列表。
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