Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RMI空指针?_Java_Nullpointerexception_Rmi - Fatal编程技术网

Java RMI空指针?

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

抱歉,如果这是一个“duh”问题,这是我第一次讨论堆栈溢出。我的问题是,我的代码中不断出现空指针异常,我不知道如何修复它

    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";
}