죄송합니다. 'duh'질문 인 경우 스택 오버플로가 처음입니다. 내 질문은, 내 코드에서 null 포인터 예외가 계속, 그리고 그것을 어떻게 수정 해야할지 모르겠다.RMI Null 포인터?
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)
...
다음과 같이 내 코드는 설계 : 내 서버에 연결된 클라이언트를 추적, 다른 모든 클라이언트로 메시지를 보낼 수 있습니다 내 고객이 해당 메시지를 추가하는 방법 'sendToAll를(), 전화 RMI를 사용하여 모든 클라이언트의 JTextAreas. 당신이 궁금해하는 경우에, 나는 RMI Registry를 실행 해왔고 Java JDK와 함께 제공되는 rmic 도구에서 스텁을 얻었습니다. 필자는 Windows XP에서 Notepad ++을 명령 프롬프트와 함께 사용하고 있습니다. 나는 또한 이것을 많은 웹 사이트에서 연구했고 대답을 찾지 못했습니다. 내 서버 코드는 다음과 같습니다 :
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();
}
}
}
내 클라이언트 코드는 여기에 있습니다 :
package client;
import javax.swing.*;
import java.io.*;
import java.net.*;
import java.awt.event.*;
import java.awt.*;
import server.*;
import java.util.*;
import java.rmi.*;
public class ChatClientRMI implements Serializable{
public static final long serialVersionUID = -3528211100794109108L;
private JFrame frame;
private JTextField input;
private JTextArea output;
private JButton button;
private JPanel inputPanel, outputPanel;
private Container panel;
private String username;
private JMenuBar menuBar;
private JMenu menu;
private JMenuItem menuItem;
private JList<ChatClientRMI> list;
private Vector<ChatClientRMI> clients = new Vector<ChatClientRMI>();
private ChatRemote remote;
public ChatClientRMI(String user){
username = user;
}
public void go(String ip){
try{
remote = (ChatRemote) Naming.lookup("rmi://"+ip+"/ChatterBoxServer");
remote.registerMe(this);
}catch(Exception ex){ex.printStackTrace(); System.exit(0);}
frame = new JFrame("ChatterBox client");
panel = frame.getContentPane();
//panel = new JPanel();
//panel.setLayout(new BorderLayout());
inputPanel = new JPanel();
outputPanel = new JPanel();
input = new JTextField(20);
inputPanel.add(input);
button = new JButton("Send");
inputPanel.add(button);
EnterListener el = new EnterListener();
button.addActionListener(el);
input.addActionListener(el);
output = new JTextArea(10,40);
output.setLineWrap(true);
output.setEditable(false);
list = new JList<ChatClientRMI>(clients);
outputPanel.add(new JScrollPane(output));
outputPanel.add(new JScrollPane(list));
panel.add(outputPanel, BorderLayout.NORTH);
panel.add(inputPanel, BorderLayout.SOUTH);
menuBar = new JMenuBar();
menu = new JMenu("Server");
menuItem = new JMenuItem("Host a server");
menuItem.addActionListener(new HostListener());
menu.add(menuItem);
menuItem = new JMenuItem("Connect to a different server");
menuItem.addActionListener(new ConnectListener());
menu.add(menuItem);
menuBar.add(menu);
frame.setJMenuBar(menuBar);
//frame.setContentPane(panel);
frame.setVisible(true);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Deprecated
public JTextArea getOutput(){
return output;
}
public String append(String s){
output.append(s+"\n");
return s+"\n";
}
public String toString(){
return username;
}
public static void main(String[] args){
new ChatClientRMI(args[0]).go(args[1]);
}
class EnterListener implements ActionListener{
public void actionPerformed(ActionEvent ae){
try{
if (list.getSelectedValuesList().size() < 1){ // assume that they were too lazy and expect the program to do it for them
remote.sendToAll(ChatClientRMI.this, input.getText());
}else{ // send it to only the selected clients
remote.sendTo(ChatClientRMI.this, input.getText(), list.getSelectedValuesList());
}
}catch(NullPointerException ex){
System.out.println("Null pointer:");
ex.printStackTrace();
System.out.println("Caused by:");
ex.getCause().printStackTrace();
/*}catch(RemoteException ex){
System.out.println("Remote exception:");
ex.printStackTrace();*/
}catch(Exception ex){
ex.printStackTrace();
}
}
}
class HostListener implements ActionListener{
public void actionPerformed(ActionEvent ae){
Thread t = new Thread(new Runnable(){
public void run(){
ChatServerRMI.main(null);
}
});
t.start();
}
}
class ConnectListener implements ActionListener{
public void actionPerformed(ActionEvent ae){
frame.setVisible(false);
ChatClientRMI.this.go(JOptionPane.showInputDialog(frame, "Server IP:"));
}
}
}
내 원격 인터페이스 :
package server;
import java.rmi.*;
import java.util.*;
import client.*;
public interface ChatRemote extends Remote{
public void add(ChatClientRMI client) throws RemoteException;
public ArrayList<ChatClientRMI> getClients() throws RemoteException;
public void sendTo(ChatClientRMI from, String msg, List<ChatClientRMI> to) throws RemoteException;
public void sendToAll(ChatClientRMI from, String msg) throws RemoteException;
public void registerMe(ChatClientRMI me) throws RemoteException;
}
도와주세요! 이것은 매우 실망 스럽습니다. 자세한 내용이 필요하면 알려주십시오.
심지어 그것은 JTextArea에에 널 포인터 예외 출력을 "HI"던져하지 않습니다
public static void main(String[] args){
ChatClientRMI chatClient = new ChatClientRMI(args[0]);
chatClient.go(args[1]);
chatClient.append("HI");
}
내 주요 방법을 대체했다,하지만 난 버튼을 클릭 할 때를 보낼 수
편집 메시지를 보내고 'sendToAll()'메소드를 트리거하면 위에 언급 한 것과 같은 널 포인터 예외가 발생합니다.
의심되는 점은 귀하의 등록 방법과 관련이 없다고 생각하는 것입니다. 클라이언트는'Serializable'을 구현하므로 복사되어 원격 서버로 전송됩니다. 서버의 해당 직렬화되지 않은 객체에 대한 호출은 시스템의 클라이언트에 도달하지 않습니다. 또한'rmic'을 필요로하지 않아야합니다. Java 1.3 이후로는 필요하지 않았습니다. –