【问题标题】:Returning a method of another class within a method. Causing java.lang.NullPointerException [duplicate]在方法中返回另一个类的方法。导致 java.lang.NullPointerException [重复]
【发布时间】:2016-01-24 19:20:38
【问题描述】:

我是 Java 新手,我正在创建通用社交媒体网站。我的用户类有能力创建一个“发布”类。尝试查看这些帖子时,我收到上述错误。我想在类中创建一个方法,以便用户类和视图是与它的 post 类关联的字符串。

   import java.util.Scanner;
public class User {
  private String password, address;
  private Post myPost;
  private int age;
  public String userName;

public User (String u, String p, String l, int a) {
   userName = u;
   password = p;
   address = l;
   age = a;
}

  public String viewLoginName ( ) {
    return userName;
  }

  public String viewPassword ( ) {
    return password;
  }

  public String viewAddress ( ) {
    return address;
  }

  public int viewAge ( ) {
    return age;
  }

  public Post createPost ( ) {
    Scanner reader = new Scanner ( System.in );
    String message;
    System.out.println("What would you like to share? ");
    message = reader.next ( );
    myPost = new Post(userName + ": " + message);
    return myPost;
  }
  public String viewMyPost()
   { 
     return myPost.viewPost();
  }
//the new method meant to allow users to view other users post
 public String viewUserPost(String user)
     {
      return user.viewMyPost();
     } 
}




//Post Class

import java.util.Scanner;
public class Post {
    private String message, acknowledged = "";
    //Scanner reader = new Scanner ( System.in );
    //message = reader.nextString ( );

    public Post(String m) {
        message = m;
    }
    public String viewPost() {
        return message;
    }

    public String acknowledge() {
        System.out.println("What is your username?");
        Scanner reader = new Scanner(System. in );
        String acknowledger;
        acknowledger = reader.next();
        acknowledged = acknowledged + acknowledger + ',';
        return acknowledged;

    }
}

【问题讨论】:

  • public String viewUserPost(String user) { return user.viewMyPost(); }

标签: java class return


【解决方案1】:

您通过在方法中重新声明 myPost 变量来隐藏它。这使类字段为空。不要重新声明它。

public String createPost() {
    Scanner reader = new Scanner(System. in );
    String message;
    System.out.println("What would you like to share? ");
    message = reader.next();

    // Post myPost = new Post(userName + ": " + message);
    myPost = new Post(userName + ": " + message); // note the difference?

    return "";
}

作为附带建议,我会将所有用户界面代码从您的 User 类中取出,因为它不属于那里,并且您可能会通过一遍又一遍地创建 Scanner 对象而遇到资源问题。相反,UI 代码属于它自己的类中的其他位置,您应该考虑为 createPost 方法提供一个名为 message 的字符串参数。

此外,我还会考虑摆脱 Post 变量本身及其 getter 方法,而只需让 createPost(String message) 方法在调用时返回 Post 对象。现在它返回一个无用的空字符串,这对您或您的用户没有帮助。

public Post createPost(String message) {
    return new Post(userName + ": " + message); 
}

【讨论】:

  • 我明白了。谢谢,但是删除 Post 变量有什么用(我假设您的意思是变量“myPost”我不需要它来创建类。抱歉,如果我不完全理解您的理解. 谢谢!
  • @DeandreYuselfBauswell:我假设用户的帖子在不断变化,但我认为您永远不需要以这种方式将帖子与用户相关联。您可能只会在调用 createPost() 之后才调用 getPost()。最好只使用一种方法 createPost(String message) 并省去不必要的变量。
  • 我明白了,但我也想允许其他用户通过调用方法查看帖子:viewUserPost,它将接受海报用户名的参数。并返回 user.viewMyPost
  • @DeandreYuselfBauswell:好的,然后考虑保留帖子,或者ArrayList<Post>,但仍然让 createPost 方法返回一个帖子。
  • 非常感谢您的帮助!好的最后一个问题:你能看一下引导我理解我如何让我的用户类有一个方法来调用另一个用户的 viewMyPost 方法以查看他们的帖子吗?
猜你喜欢
  • 1970-01-01
  • 2022-12-04
  • 2023-04-03
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 2022-09-29
相关资源
最近更新 更多