getMethod返回null java

时间:2015-03-31 11:44:58

标签: java null return getmethod

我在文件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());

  }
}

你能帮帮我吗?

5 个答案:

答案 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方法。

{p> 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;
    }
}

使用异常处理始终是一种很好的做法。