Java RMI空指针?
抱歉,如果这是一个“duh”问题,这是我第一次讨论堆栈溢出。我的问题是,我的代码中不断出现空指针异常,我不知道如何修复它Java RMI空指针?,java,nullpointerexception,rmi,Java,Nullpointerexception,Rmi,抱歉,如果这是一个“duh”问题,这是我第一次讨论堆栈溢出。我的问题是,我的代码中不断出现空指针异常,我不知道如何修复它 java.lang.NullPointerException at client.ChatClientRMI.append(ChatClientRMI.java:76) at server.ChatServerRMI.sendTo(ChatServerRMI.java:38) at server.ChatServerRM
java.lang.NullPointerException
at client.ChatClientRMI.append(ChatClientRMI.java:76)
at server.ChatServerRMI.sendTo(ChatServerRMI.java:38)
at server.ChatServerRMI.sendToAll(ChatServerRMI.java:43)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
...
我的代码设计如下:我的服务器跟踪连接到它的客户机,我的客户机可以通过使用RMI调用方法“sendToAll()”向所有其他客户机发送消息,该方法将该消息附加到所有客户机的jTextArea。如果您想知道,我一直在运行RMI注册表,并且从JavaJDK附带的rmic工具中获得了存根。如果有必要的话,我正在Windows XP上使用带命令提示符的记事本+。我也在许多网站上对此进行了研究,但没有找到答案。我的服务器代码如下:
package server;
import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
import server.*;
import java.rmi.*;
import java.rmi.server.*;
import client.*;
public class ChatServerRMI extends UnicastRemoteObject implements ChatRemote{
private JFrame frame;
private JTextArea area;
private ArrayList<ChatClientRMI> clients = new ArrayList<ChatClientRMI>();
public ChatServerRMI() throws RemoteException{
try{
frame = new JFrame("ChatterBox Server -- IP: "+InetAddress.getLocalHost().getHostAddress());
}catch(Exception ex){
frame = new JFrame("ChatterBox Server");
}
area = new JTextArea(10,40);
area.setLineWrap(true);
area.setEditable(false);
frame.getContentPane().add(BorderLayout.CENTER, new JScrollPane(area));
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public void registerMe(ChatClientRMI me){
clients.add(me);
}
public void go(){
}
public void sendTo(ChatClientRMI from, String s, java.util.List<ChatClientRMI> to){
for(ChatClientRMI c : to){
System.out.println(c.append(from.toString()+": "+s));
//c.append(from.toString()+": "+s);
}
}
public void sendToAll(ChatClientRMI from, String s){
sendTo(from, s, clients);
}
public void add(ChatClientRMI client){
clients.add(client);
}
public ArrayList<ChatClientRMI> getClients(){
return clients;
}
public static void main(String[] args){
try{
ChatServerRMI chat = new ChatServerRMI();
//ChatRemote stub = (ChatRemote) UnicastRemoteObject.exportObject(chat, 12345);
Naming.rebind("rmi://127.0.0.1/ChatterBoxServer", chat);
chat.go();
/*}catch(AlreadyBoundException ex){
System.out.println("Already bound");*/
}catch(Exception ex){
System.out.println("Sorry, but the initializing failed.");
ex.printStackTrace();
}
}
}
它不会抛出空指针异常并将“HI”输出到JTextArea,但当我单击按钮发送消息时,触发“sendToAll()”方法,它抛出与上述相同的空指针异常
java.lang.NullPointerException
at client.ChatClientRMI.append(ChatClientRMI.java:76)
您正在取消对ChatClientRMI类第76行的空引用的引用。当然你可以在你自己的代码中找到76?这个问题与RMI没有任何关系,在client.ChatClientRMI.append(ChatClientRMI.java:76)上也找不到任何包含
java.lang.NullPointerException解决方案的网站。你真的应该能够调试自己的NPE。你的问题是在这段代码中
public String append(String s){
output.append(s+"\n");
return s+"\n";
}
当output
为空时,您正在调用output
上的append
。我能想到的唯一原因是在调用go
方法之前调用append
方法。祝你好运。我知道这是一个空引用。我只是不知道是什么原因造成的,因为我已经预先初始化了所有的东西。我也知道如何调试这个。正如我所说,我试过20次调试它,但没有运气。我已经做了一个没有RMI版本的这个,它的工作非常完美。所以我知道它必须进行w/RMI。见鬼,当你在批评我的时候,为什么你不试着至少提供一个体面的答案,而不是简单地说出来。如果你知道如何调试它,为什么不调试它,而不是射击信使?这只是一个简单的方法。实际上只有一种可能性。在我的main方法中,它希望用户名和IP地址连接到该方法,它调用'go()'方法,该方法初始化变量'output',因此我认为JTextArea'output'不会为null,除非RMI跳过该值。不过,谢谢你的尝试。我怀疑这与你的注册方式有关,而不是你认为的那样。您的客户端实现了可序列化
,因此将被复制并发送到远程服务器。对服务器上反序列化对象的调用将不会到达您计算机上的客户端。另外,您不应该需要rmic
——我相信,自Java1.3以来,这是不需要的。
public static void main(String[] args){
ChatClientRMI chatClient = new ChatClientRMI(args[0]);
chatClient.go(args[1]);
chatClient.append("HI");
}
java.lang.NullPointerException
at client.ChatClientRMI.append(ChatClientRMI.java:76)
public String append(String s){
output.append(s+"\n");
return s+"\n";
}