-1

我在文件 MovieReader 中写了 getMethod,如果我在这个文件中打印这个方法,一切都运行良好。

import java.io.BufferedReader; // scanner
import java.io.FileReader;
public class MovieReader {

    private static String text;

    public static void main(String args[]) throws Exception {
        FileReader file = new FileReader("C:/Users/krystian/Desktop/filmDateBaseProject/movies.txt");
        BufferedReader reader = new BufferedReader(file);
        text = "";
        String line = reader.readLine();
        while(line != null) {
            text+= line +"\n";
            line=reader.readLine();
        }
        reader.close();
        System.out.println(getText()); // This method works
    }

    public static String getText() {
        return text;
    }

}

但是当我试图从其他文件中调用这个方法时,它正在打印 null

public class Userr{

   public static void main(String args[]){

      MovieReader user = new MovieReader();

      System.out.println(user.getText());

  }
}

你能帮我吗?

4

5 回答 5

2

MovieReader类中加载文件并textmain()方法中填充内容。当您创建一个新MovieReader对象时,该main()方法没有被执行,因此该text字段没有被初始化。

您可以在其中创建一个静态加载器方法MovieReader并将代码从那里移动main()到那里,如下所示:

public static void loadMovieInfo() {
    FileReader file = new FileReader("C:/Users/krystian/Desktop/filmDateBaseProject/movies.txt");
    ... // rest of the code
    reader.close();
}

在尝试调用之前先调用它getText()

MovieReader.loadMovieInfo();
System.out.println(MovieReader.getText());

如果要在text创建对象时加载文件并填充文件的内容,可以转为text实例变量,在MovieReader构造函数中加载文件信息。

例子:

public class MovieReader {
    private String text;

    public MovieReader() {
        FileReader file = new FileReader("C:/Users/krystian/Desktop/filmDateBaseProject/movies.txt");
        BufferedReader reader = new BufferedReader(file);
        this.text = "";
        String line = reader.readLine();
        while(line != null) {
            this.text += line +"\n";
            line=reader.readLine();
        }
        reader.close();
    }

    public String getText() {
        return this.text;
    }
}

那么这应该工作:

MovieReader user = new MovieReader();
System.out.println(user.getText());

另外,有几点观察:

  • 静态方法属于类(不属于特定对象),应使用类名调用:

    MovieReader.getText()
    
  • 您应该使用StringBuilder( docs here ) 而不是String串联来填充text变量的内容。

于 2015-03-31T11:48:28.537 回答
0

试试这个。

import java.io.BufferedReader; // scanner
import java.io.FileReader;
public class MovieReader {

    private static String text;

    public static String getText() {

        FileReader file = new FileReader("C:/Users/krystian/Desktop/filmDateBaseProject/movies.txt");
        BufferedReader reader = new BufferedReader(file);
        text = "";
        String line = reader.readLine();
        while(line != null) {
            text+= line +"\n";
            line=reader.readLine();
        }
        reader.close();
        System.out.println(getText()); // This method works
        return text;
    }

}

public class Userr{

   public static void main(String args[]){

      MovieReader user = new MovieReader();

      System.out.println(user.getText());

  }
}
于 2015-03-31T11:50:10.917 回答
0

假设您正在运行类的main()方法Userr

main()类的方法和getText()方法是MovieReader相互独立的。如果你调用getText()方法,它会返回text变量的值而不对其进行任何操作,main()方法[MovieReader]的cos操作不会执行。这就是为什么你没有得到预期的结果。

尝试重新考虑您的代码,如下所示。

public class Movie {

    public static void main(String[] args) {
        MovieReader user = new MovieReader();
        String file = "C:/Users/krystian/Desktop/filmDateBaseProject/movies.txt";
        System.out.println(user.getText(file));
    }
}

和 MovieReader 类,

class MovieReader {

    private String text;

    String getText(String fileName) {
        FileReader file;
        file = null;
        try {
            file = new FileReader(fileName);
            BufferedReader reader = new BufferedReader(file);
            text = "";
            String line = reader.readLine();
            while (line != null) {
                text += line + "\n";
                line = reader.readLine();
            }
            reader.close();
            return text;
        } catch (FileNotFoundException ex) {
            Logger.getLogger(MovieReader.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(MovieReader.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                file.close();
            } catch (IOException ex) {
                Logger.getLogger(MovieReader.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }
}

使用异常处理始终是一个好习惯。

于 2015-03-31T12:18:55.487 回答
0

首先,您应该使用类名调用静态 getText() 方法。

MovieReader.getText()

二、静态字符串的默认值:

It's initialized to null if you do nothing, as are all reference types.

因为,您没有做任何事情,这就是为什么 text 的值为 null 的原因。

参考以下固定代码:

电影阅读器类

public class MovieReader {

 private static String text;

 public static void main(String args[]) throws Exception {
    FileReader file = new FileReader("C:/Users/krystian/Desktop/filmDateBaseProject/movies.txt");
    BufferedReader reader = new BufferedReader(file);
    text = "";
    String line = reader.readLine();
    while(line != null) {
        text+= line +"\n";
        line=reader.readLine();
    }
    reader.close();
    System.out.println(getText()); // This method works
 }

 public static String getText() {
    return text;
 }

}

用户类:

public class Userr{

   public static void main(String args[]){


      try {
        MovieReader.main(null);
    } catch (Exception e) {

        e.printStackTrace();
    }

      System.out.println(MovieReader.getText());

  }
}
于 2015-03-31T11:54:50.053 回答
0

快速而肮脏的修复:调用 MovieReader.main 方法。

更长的答案,你应该怎么做:你可能来自像 python 这样的脚本背景。您在这里所做的是创建两个脚本,基本上,包装在类中。当你调用java时,你有一个类作为入口点,它的main方法被调用。

因此,您创建了一个加载文件的脚本和另一个读取文件的脚本,您的期望是调用这两个主要方法。你需要回去设计!

更好的方法是在 MovieReader 中只使用一个最小的 main(),而是使用 main() 调用的 readMovies() 之类的方法。然后在调用 getText() 之前让 User.main() 也调用该方法。

不要把所有的逻辑放在 main

于 2015-03-31T11:53:01.137 回答