尝试通过套接字发送arrayList,在对象输入流初始化(客户端)时获取空指针异常。
客户端:
try {
ObjectInputStream objIn = new ObjectInputStream(
Client.socket.getInputStream()); // HERE
library = (ArrayList<Book>) objIn.readObject();
} catch (IOException e) {
服务器:
try {
ObjectOutputStream objOut = new ObjectOutputStream(
this.client.getOutputStream());
objOut.writeObject(library);
objOut.flush(); // added later, not helping
}
我一直试图在套接字上通信两天,但几乎没有成功。我不知道是怎么回事。当我有更多时间时,我打算更好地记录自己,但现在我真的很想了解发生了什么。
修改
public class Client {
private static int port = 6666;
private static Socket socket = null;
public Client (int port) {
Client.port = port;
}
public Client () {
}
public void establishConnection() {
try {
Client.socket = new Socket(InetAddress.getByName(null), Client.port);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
服务器:
public void start () {
(new Thread() {
public void run() {
try {
Server.socket = new ServerSocket(Server.portNumber);
while (!Server.stop) {
Socket client = Server.socket.accept();
(new HandleRequest (client)).start();
}
...............
public class HandleRequest extends Thread {
private Socket client = null;
private SQL sql_db = new SQL ();
public HandleRequest (Socket client) {
this.client = client;
}
@Override
public void run () {
try {
if (!this.sql_db.isConnected())
this.sql_db.connect();
if (this.client == null) {
System.out.println("Error: client does not exist, NO idea what's going on");
return;
}
ArrayList<Book> library = this.sql_db.getAllBooks();
try {
ObjectOutputStream objOut = new ObjectOutputStream(
this.client.getOutputStream());
objOut.writeObject(library);
objOut.flush();
} catch (Exception e) {
System.out.println("Server error in handling request for whole library!");
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:2)
您之前调用了establishConnection
方法
try {
ObjectInputStream objIn = new ObjectInputStream(
Client.socket.getInputStream()); // HERE
library = (ArrayList<Book>) objIn.readObject();
} catch (IOException e) {
如果没有,您的Client.socket为null,您需要初始化它。即您的代码应如下所示:
try {
Client c = new Client(1337);
c.establishConnection();
ObjectInputStream objIn = new ObjectInputStream(
c.socket.getInputStream()); // HERE
library = (ArrayList<Book>) objIn.readObject();
} catch (IOException e) {
答案 1 :(得分:2)
因为NPE就在这条线上:
Client.socket.getInputStream());
只有一件事可以导致它。它不能是Client
,因为它是static
。它不能是getInputStream()
,因为这是一种方法,因此它必须是导致NPE的socket
。
在这一行:
private static Socket socket = null;
您将socket
设为null
。我看到你将它设置为非空的唯一地方是.establishConnection()
方法,但我看不到你在哪里调用该方法。
因此,您的问题很可能是您没有调用.establishConnection()
方法。