簡體   English   中英

getMethod返回null java

[英]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() 
  • 您應該使用StringBuilderdocs此處 )代替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變量的值,而無需對其進行任何操作MovieReadermain()方法的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM