-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、ファイルをロード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、インスタンス変数に変換し、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 )を使用する必要があります。Stringtext

于 2015-03-31T11:48:28.537 に答える
0

クラスのmain()メソッドを実行していると仮定します。Userr

main()メソッドとgetText()クラスのメソッドはMovieReader互いに独立しています。メソッドを呼び出している場合、操作なしgetText()で変数の値を返します。メソッド [クラス]cos 操作は実行されません。そのため、意図した結果が得られません。textmain()MovieReader

以下のようにコードをリファクタリングしてみてください。

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

これを試してみてください。

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

まず、静的な getText() メソッドをクラス名で呼び出す必要があります。

MovieReader.getText()

第二に、静的文字列のデフォルト値:

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

あなたは何もしていないので、テキストの値が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());

  }
}
于 2015-03-31T11:54:50.053 に答える