【问题标题】:Can't access to classes static element无法访问类静态元素
【发布时间】:2019-12-19 04:12:04
【问题描述】:

我有一个名为SharedBoard 的对象,它是一个静态实体,所以我希望它被所有类共享。我有这个方法getBoard(),它返回SharedBoard对象;但是,当我尝试从另一个类调用此方法时,我总是得到一个NullPointerException。实际上,我什至无法通过这种方法打印板上的元素。我是否在某处遗漏了 OOP 概念?

public class Server {
    private ServerSocket serverSocket;
    private static SharedBoard board;

    // The set of all the print writers for all the clients, used for broadcast.
    private Set<PrintWriter> writers = new HashSet<>();

    public Server(ServerSocket serverSocket) {
        this.serverSocket = serverSocket;
        Server.board = new SharedBoard();
    }

    public static SharedBoard getBoard() {
        for(int i=0; i<9; i++)
            System.out.println(board.moves[i]);
        return board;
    }

这是SharedBoard类/构造函数的部分:

public class SharedBoard {

    private final Object lock = new Object();
    int[] moves;

    SharedBoard() {

        moves = new int[9];

        for(int i=0; i<9; i++)
                moves[i] = 0;
    }

.
.
.
}


【问题讨论】:

  • 您的代码是否在任何地方创建了Server 对象?如果没有,则 Server.board = new SharedBoard(); 行将不会运行,因此 board 仍将为空。
  • 其实你是对的。我只是对服务器的引用。这就是为什么它不起作用谢谢你

标签: java class oop methods


【解决方案1】:

Server 类的构造函数未被调用。因此语句Server.board = new SharedBoard(); 没有被调用,它总是为空。所以你从这个语句中得到了来自System.out.println(board.moves[i]);的NPE。

我们可以解决这个问题 从构造函数初始化服务器对象或使用静态初始化块初始化板对象

class Server {
private ServerSocket serverSocket;
private static SharedBoard board;

static {
    board = new SharedBoard();
}

// The set of all the print writers for all the clients, used for broadcast.
private Set<PrintWriter> writers = new HashSet<>();

public Server(ServerSocket serverSocket) {
    this.serverSocket = serverSocket;
}

public static SharedBoard getBoard() {
    for (int i = 0; i < 9; i++)
        System.out.println(board.moves[i]);
    return board;
    }
}

或者直接在类中初始化

private static SharedBoard board= new SharedBoard();

【讨论】:

    【解决方案2】:

    加载类时,所有静态成员都被初始化并使用默认值加载到内存中。所以 SharedBoard 是 Server 类的静态变量,这就是为什么你的 SharedBoard 被初始化为默认值,即 null。

    因此,在加载静态变量时,您必须在 SIB(静态块)中手动实例化您的 SharedBoard,例如...

    static {
         board = new SharedBoard();
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多