通过访问第二个类的java null指针

时间:2013-04-06 00:57:58

标签: java

您好我的java编码有问题。我无法弄清楚如何指向一个物体。

代码看起来像这样。我有两节课。用户和用户。将用户列表作为链接列表进行管理的用户类是添加,删除等的类。我必须编写一个方法,然后将消息从一个用户发送给另一个用户。

该方法位于User类中,另一个send方法位于Users类中,将由User - send()调用以访问该列表。由于用户的主要构造函数设置为驱动整个程序。我必须编写另一个构造函数。但我被困在这里。

import java.util.*;

public class User 
{
    private String name;
    private Users users;

    public User()
    {
        this.name = readName();
    }
    public User(Users users)
    {
        this.users = users;
    }
    private String readName()
    {
        System.out.print("  Name: ");
        return In.nextLine();
    }
    public boolean matches(String name)
    {
        return this.name.equals(name);
    }
    public String getName()
    {
        return this.name;
    }

    public void use()
    {
        char c = readChoice();
        while (!isEnd(c))
        {
            execute(c);
            c = readChoice();
        }
    }
    private char readChoice()
    {
        System.out.print("  Choice (l/r/s/d/x): ");
        return In.nextChar();
    }
    private boolean isEnd(char c)
    {
        return c == 'x';
    }
    private void execute(char c)
    {
        switch(c)
        {
        case 'l': look(); break;
        case 'r': read(); break;
        case 's': send(); break;
        default : System.out.println("    Invalid choice");
        }
    }
    private void look()
    {

    }
    private void read()
    {

    }
    private void send()
    {
        users.send();
    }

}

第二课

import java.util.*;

public class Users 
{
    public static void main(String[] args)
    {
        new Users();
    }

    private LinkedList<User> users = new LinkedList<User>();
    private LinkedList<Email> emails = new LinkedList<Email>();

    public Users()
    {       
        menu();
    }

    private void menu()
    {
        char c = readChoice();
        while (!isEnd(c))
        {
            execute(c);
            c = readChoice();
        }
    }
    private char readChoice()
    {
        System.out.print("Choice (a/d/g/u/x): ");
        return In.nextChar();
    }
    private boolean isEnd(char c)
    {
        return c == 'x';
    }
    private void execute(char c)
    {
        switch(c)
        {
        case 'a': add(); break;
        case 'd': delete(); break;
        case 'g': break;
        case 'u': use(); break;
        default : System.out.println("    Invalid choice");
        }
    }

    private void add()
    {
        User user = new User();
        if (!exists(user.getName()))
        {   
            users.add(user);
            System.out.println("    User " + getIndex(user) + ": " +     


                        user.getName());
        }
        else
            System.out.println("already exists");
    }

    private int getIndex(User user)
    {
        int index = users.indexOf(user) + 1;
        return index;
    }

    private void delete()
    {
        User user = user(readName());
        if (user != null)
            users.remove(user);
        else
            System.out.println("  No such name");
    }

    public void send()
    {

    }

    private void use()
    {
        User user = new User();
        if (exists(user.getName()))
            user.use();
        else
            System.out.println("    No such user");
    }

    private boolean exists(String name)
    {
        return user(name) != null;
    }

    private User user(String name)
    {
        for (User user: users)
            if (user.matches(name))
                return user;
        return null;
    }

    private String readName()
    {
        System.out.print("  Names: ");
        return In.nextLine();
    }
}

1 个答案:

答案 0 :(得分:0)

在第一个文件(类)中,您需要初始化变量。 private Users users = new Users();

这样,您的send方法将不会访问空对象。

但是,查看您的代码时,您遇到了一个更大的问题:用户访问用户,反之亦然。

您的问题不是空指针,您的问题是您的程序设计不正确。如果ClassA使用ClassB,ClassB应该尽可能使用ClassA。在您的情况下,您需要重新考虑您的逻辑。

要使用建议的解决方案,当您在第二个文件中实例User时,您应该将当前对象作为参考传递。喜欢这个

  private void add()
  {
    User user = new User(this);
    ...
  }

和这个

 private void use()
{
    User user = new User(this);
    ...
}