2013-06-14 1 views
-1

죄송합니다. '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()'메소드를 트리거하면 위에 언급 한 것과 같은 널 포인터 예외가 발생합니다.

+0

의심되는 점은 귀하의 등록 방법과 관련이 없다고 생각하는 것입니다. 클라이언트는'Serializable'을 구현하므로 복사되어 원격 서버로 전송됩니다. 서버의 해당 직렬화되지 않은 객체에 대한 호출은 시스템의 클라이언트에 도달하지 않습니다. 또한'rmic'을 필요로하지 않아야합니다. Java 1.3 이후로는 필요하지 않았습니다. –

답변

2
java.lang.NullPointerException 
    at client.ChatClientRMI.append(ChatClientRMI.java:76) 

ChatClientRMI 클래스의 76 행에서 참조를 참조 해제하고 있습니다. 확실히 코드에서 76처럼 찾을 수 있습니까? 이 문제는 RMI와는 아무런 관련이 없으므로 java.lang.NullPointerException at client.ChatClientRMI.append(ChatClientRMI.java:76)에 대한 해결책이 포함 된 웹 사이트를 찾을 수 없습니다. 정말로 자신의 NPE를 디버그 할 수 있어야합니다.

+0

그것이 null 참조임을 알고 있습니다. 나는 모든 것을 미리 초기화했기 때문에 원인을 알지 못합니다. 나는 또한 이것을 디버깅하는 방법을 안다. 내가 말했듯이 20 번 w/no 행운처럼 디버깅을 시도했다. 나는 RMI 버전을 만들지 않았고 완벽하게 작동한다. 그래서 나는 그것이 RMI와 함께해야한다는 것을 안다. – user2483722

+0

그리고 당신이 나를 비난하는 동안, 적어도 명백한 대답을하기보다는 괜찮은 대답을 제공하려고 노력하는 것이 어떻습니까? – user2483722

+1

디버깅 방법을 안다면, 메신저를 쏘는 대신 디버깅 *을하지 않는 이유는 무엇입니까? 그것은 단지 짧은 방법 일뿐입니다. 정말로 유일한 가능성이 있습니다. – EJP

1

귀하의 문제는 output가 null의 경우이 코드

public String append(String s){ 
    output.append(s+"\n"); 
    return s+"\n"; 
} 

에 당신은 outputappend를 호출하는 것입니다. 내가 이것을 생각할 수있는 유일한 이유는 go 메서드를 호출하기 전에 append 메서드를 호출하는 것입니다. 행운을 빕니다.

+0

내 주된 방법은 사용자 이름과 IP 주소가 연결될 것으로 예상되는 곳에서 변수 'output'을 초기화하는 'go()'메서드를 호출하므로 JTextArea 'output'이 null이 될 것이라고 생각하지 않습니다. RMI가이를 건너 뛰지 않는 한. 그래도 고마워. – user2483722