【问题标题】:getMethod return null javagetMethod 返回 null java
【发布时间】:2015-06-04 17:55:45
【问题描述】:

我在文件 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 方法。
  • 你能再写点什么吗?

标签: java null return getmethod


【解决方案1】:

MovieReader 类中加载文件并在main() 方法中填充text 的内容。当你创建一个新的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) 而不是String 连接来填充text 变量的内容。

【讨论】:

  • 在其他文件中创建新对象时如何执行 main 方法?
【解决方案2】:

试试这个。

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());

  }
}

【讨论】:

  • 只发布代码而不做任何进一步的解释对他学习没有任何帮助。
【解决方案3】:

快速而肮脏的修复:调用 MovieReader.main 方法。

更长的答案,你应该怎么做: 你可能来自像 python 这样的脚本背景。您在这里所做的是创建两个脚本,基本上,包装在类中。当你调用java时,你有一个类作为入口点,它的main方法被调用。

因此,您创建了一个加载文件的脚本和另一个读取文件的脚本,您的期望是调用这两个主要方法。你需要回去设计!

更好的方法是在 MovieReader 中只使用一个最小的 main(),而使用 main() 调用的 readMovies() 之类的方法。然后在调用 getText() 之前让 User.main() 也调用该方法。

不要把所有的逻辑都放在main中

【讨论】:

  • 或者,从 MovieReader 构造函数调用 readMovies()。
【解决方案4】:

首先,您应该使用类名调用静态 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());

  }
}

【讨论】:

    【解决方案5】:

    假设您正在运行Userr 类的main() 方法。

    MovieReader类的main()方法和getText()方法是相互独立的。如果你调用getText()方法,它会返回text变量的值而不对其进行任何操作,main()方法的cos操作[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;
        }
    }
    

    使用异常处理总是一个好习惯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 2019-08-25
      • 2016-05-28
      相关资源
      最近更新 更多