[英]getMethod return null java
我在文件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());
}
}
你能幫我嗎?
在MovieReader
類中,您加載文件並在main()
方法中填充text
內容。 創建新的MovieReader
對象時,不會執行main()
方法,因此不會初始化text
字段。
您可以在MovieReader
創建一個靜態加載器方法, 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此處 )代替String
串聯來填充text
變量的內容。
試試這個。
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());
}
}
快速而骯臟的修復方法:調用MovieReader.main方法。
更長的答案是,您應該如何實際執行:您可能來自像python這樣的腳本背景。 您在這里所做的基本上是創建兩個包裝在類中的腳本。 調用java時,有一個類作為入口點,其主方法被調用。
因此,您創建了一個加載文件的腳本,另一個創建了讀取文件的腳本,您的期望是調用了兩個主要方法。 您需要返回設計!
更好的方法是在MovieReader中僅具有最小的main(),而使用諸如readMovies()之類的方法,由main()調用。 然后,在調用getText()之前,也讓User.main()調用該方法。
不要把所有邏輯都放在主要
首先,您應該使用類名調用靜態getText()方法。
MovieReader.getText()
二,靜態字符串的默認值:
It's initialized to null if you do nothing, as are all reference types.
因為,您沒有做任何事情,所以text的值為null。
請參考以下固定代碼:
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;
}
}
用戶類:
public class Userr{
public static void main(String args[]){
try {
MovieReader.main(null);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(MovieReader.getText());
}
}
假設您正在運行Userr
類的main()
方法。
MovieReader
類的main()
方法和getText()
方法彼此獨立。 如果要調用getText()
方法,它將返回text
變量的值,而無需對其進行任何操作, MovieReader
類的main()
方法的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;
}
}
使用異常處理始終是一個好習慣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.