Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串数组返回空值_Java - Fatal编程技术网

Java 字符串数组返回空值

Java 字符串数组返回空值,java,Java,在下面的代码中,我读取带有电影列表的文本文件,并使用助手方法创建电影列表的字符串数组。在该方法中,我能够读取和打印文件的每一行。但是,当我尝试在main方法中迭代返回的数组时,只得到“null”。为什么会发生这种情况。到目前为止,在我的研究中,我还没有发现其他人发布的类似问题。请帮忙。谢谢 import java.util.Random; import java.util.Scanner; import java.io.File; public class GuessTheMovie {

在下面的代码中,我读取带有电影列表的文本文件,并使用助手方法创建电影列表的字符串数组。在该方法中,我能够读取和打印文件的每一行。但是,当我尝试在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;
}
import java.util.Random;
导入java.util.Scanner;
导入java.io.File;
公共类猜谜游戏{
公共静态void main(字符串[]args)引发异常{
试一试{
//创建文件和扫描仪对象
File File=新文件(“movies.txt”);
扫描仪=新扫描仪(文件);
//创建字符串数组以存储所有电影标题
列表电影=createMoviesArray(扫描仪);
用于(字符串电影:电影){
System.out.println(电影);
}
/*
字符串[]电影=createMoviesArray(扫描仪);
for(int i=0;i
返回之前
createMoviesArray()
方法中创建一个新数组。您从未向该数组添加任何内容,因此从该方法返回后该数组为空。您应该在迭代文件之前创建一个新数组


如果您不知道文件的大小以及它有多少行,您可能应该使用一些动态大小的
集合
,比如
ArrayList

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

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;
    }
    
    私有静态列表createMoviesArray(扫描仪){
    列表电影=新建ArrayList();
    while(scanner.hasNextLine()){
    movies.add(scanner.nextLine());
    }
    返回电影;
    }
    

  • 用你的行
    movies=newstring[count];
    您正在创建一个新的字符串数组。此时数组将只包含
    NULL
    值,这些值在您的代码中没有任何地方实际写入数组。这就是为什么您的主方法正确地打印
    NULL

    这是因为您没有将数据添加到movies数组中,而您只是我正在初始化它

    如果要在helper方法的末尾打印movies对象,您会看到它也是null

    我建议使用
    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;
    }
    
    import java.util.Random;
    导入java.util.Scanner;
    导入java.io.File;
    公共类猜谜游戏{
    公共静态void main(字符串[]args)引发异常{
    试一试{
    //创建文件和扫描仪对象
    File File=新文件(“movies.txt”);
    扫描仪=新扫描仪(文件);
    //创建字符串数组以存储所有电影标题
    ArrayList movies=createMoviesArray(扫描仪);//将其更改为ArrayList
    对于(电影:电影){//我使用了foreach循环
    System.out.println(电影);
    }
    }捕获(例外e){
    System.out.println(“找不到文件”);
    }
    }
    //////////////////////////辅助方法////////////////////////////////////
    //创建字符串数组以存储所有电影标题
    私有静态字符串[]createMoviesArray(扫描仪){
    整数计数=0;
    ArrayList movies=新建ArrayList();//更改为数组列表
    while(scanner.hasNextLine()){
    字符串行=scanner.nextLine();
    系统输出打印项次(计数+“:“+行);
    计数+=1;
    movies.add(line);//添加到ArrayList的末尾
    }
    返回电影;
    }
    
    您也可以通过这种方式执行相同的操作:-

    package com.adddemo;
    导入java.io.File;
    导入java.util.ArrayList;
    导入java.util.List;
    导入java.util.Scanner;
    公共类猜谜游戏{
    公共静态void main(字符串[]args)引发异常{
    试一试{
    //创建文件和扫描仪对象
    File File=新文件(“C:\\Users\\lenovo\\Desktop\\movies.txt”);
    扫描仪=新扫描仪(文件);
    //创建字符串数组以存储所有电影标题
    列表电影=createMoviesArray(扫描仪);
    对于(int i=0;ipackage com.adddemo;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    public class GuessTheMovie {
    
    public static void main(String[] args) throws Exception {
    
        try {
            // Create File and Scanner objects
            File file = new File("C:\\Users\\lenovo\\Desktop\\movies.txt");
            Scanner scanner = new Scanner(file);
    
            // Create String array to store all movie titles
            List movies = createMoviesArray(scanner);
            for (int i = 0; i < movies.size(); i++) {
                System.out.println(i+" : "+movies.get(i));
            }
    
     } catch (Exception e) {
        System.out.println("Could not find file.");
     }
    
     }
    
     ////////////////////////// HELPER METHODS ////////////////////////////////////
    
    // Create String array to store all movie titles
    private static List createMoviesArray(Scanner scanner) {
    int count = 0;
    List movies = new ArrayList<>();
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        System.out.println(count + " : " + line);
        count += 1;
        movies.add(line);
    }
    return movies;
    }
    }