我在文件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());
}
}
你能帮帮我吗?
答案 0 :(得分:2)
在MovieReader
课程中,您加载文件并在text
方法中填充main()
的内容。创建新的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
转换为实例变量并在{{中加载文件信息1}}构造函数。
示例:
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()
(docs here)代替StringBuilder
连接来填充String
变量的内容。
答案 1 :(得分: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());
}
}
答案 2 :(得分:0)
快速而肮脏的修复:调用MovieReader.main方法。
答案越长,你应该如何做到这一点: 你可能来自像python这样的脚本背景。你在这里做的是创建两个脚本,基本上,包装在类中。当你调用java时,你有一个类作为入口点,其主要方法被调用。
因此,您创建了一个加载文件的脚本和另一个读取该文件的脚本,并且您希望调用两个主要方法。你需要回去设计!
更好的方法是在MovieReader中只有一个最小的main(),而是有一个像main()调用的readMovies()方法。然后让User.main()调用该方法,然后再调用getText()。
不要将所有逻辑放在主
中答案 3 :(得分:0)
首先,您应该使用类名称调用静态getText()方法。
MovieReader.getText()
其次,静态字符串的默认值:
It's initialized to null if you do nothing, as are all reference types.
因为,你没有做任何事情,这就是为什么文本的值为空。
请参阅以下固定代码:
MovieReader类
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;
}
}
Userr类:
public class Userr{
public static void main(String args[]){
try {
MovieReader.main(null);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(MovieReader.getText());
}
}
答案 4 :(得分:0)
假设您正在运行main()
类的Userr
方法。
main()
方法和getText()
类MovieReader
方法相互独立。如果您正在调用getText()
方法,它将返回text
变量的值,而不对其执行任何操作,main()
方法[ of MovieReader
class <的cos操作/ em>]不会执行。这就是为什么你没有得到预期的结果。
尝试重新考虑您的代码,如下所示。
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;
}
}
使用异常处理始终是一种很好的做法。