2011-09-29 3 views
0

정말 내 프로그램에 도움을 주시면 고맙겠습니다. 그것은 여러 클라이언트와 일종의 채팅 서버입니다. NullPointerException 스레드 실행 메서드

package com.server; 

import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 


public class Server { 
    public static int PORT; 
    private ServerSocket server; 
    private Socket socket; 

    public Server(int port) throws IOException { 
     PORT = port; 
     server = new ServerSocket(PORT); 
     System.out.println("server started"); 
     try { 
      while (true) { 
       socket = server.accept(); 
       try { 
        new ServeClient(socket); 
       } catch (IOException e) { 
        socket.close(); 
       } 
      } 
     } finally { 
      server.close(); 
     } 

    } 

    public static void main(String[] args) throws IOException { 
     int port = Integer.parseInt(args[0]); 
     Server server = new Server(port); 
    } 

} 

내가 서버를 시작하고 클라이언트를 만들 : 다음은 서버 코드입니다. 서버는 소켓 에서 연결 소켓을 수신하고 ServeClient 스레드를 작성합니다. 여기 ServeClient 코드입니다 : ServeClient는 "시도"라인 (33)가 처음으로 라인이

server started 
socket Socket[addr=/127.0.0.1,port=51438,localport=8888] 
Exception in thread "Thread-0" java.lang.NullPointerException 
    at com.server.ServeClient.run(ServeClient.java:33) 

run() 메소드를 호출 할 때

package com.server; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.util.Enumeration; 
import java.util.Vector; 

import com.gui.WindowManager; 

public class ServeClient extends Thread { 
    private final Socket socket; 
    private BufferedReader in; 
    private PrintWriter out; 
    private String msg; 
    public static final String ENDSTRING = "END"; 
    public static Vector clients = new Vector(); 

    public ServeClient(final Socket socket) throws IOException { 
     this.socket = socket; 
     System.out.println("socket " + socket); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
       socket.getOutputStream())), true); 
     start(); 
    } 

    public void run() { 
     try { 
      clients.add(this); 
      while (true) { 
       msg = in.readLine(); 
       if (msg == ENDSTRING) 
        break; 
       broadcast(msg); 
      } 
      System.out.println("closing..."); 
     } catch (IOException e) { 
      System.err.println("IO EXCEPTION"); 
     } finally { 
      try { 
       socket.close(); 
      } catch (IOException e) { 
       System.err.println("SOCKET NOT CLOSED"); 
      } 
     } 
    } 

    @SuppressWarnings("deprecation") 
    public void broadcast(String msg) { 
     synchronized (clients) { 
      Enumeration<ServeClient> e = clients.elements(); 
      while (e.hasMoreElements()) { 
       ServeClient serveClient = e.nextElement(); 
       try { 
        synchronized (serveClient.out) { 
         serveClient.out.println(msg); 
        } 
       } catch (Exception eee) { 
        serveClient.stop(); 
       } 
      } 
     } 
    } 
} 

는 내가 뭘 얻을 것은 NullPointerException이있다 ServeClient 실행의 문() 메소드

+0

스택 추적은 예외가 발생하는 행을 알려줍니다. ServeClient.java:33. 어느 선 이니? 또한 문자열을 ==와 비교하면 안됩니다. equals를 사용하십시오. –

+0

코드가 내 컴퓨터에서 작동합니다. 나는 깨진 Java 설정이나 뭔가를 가지고 있다고 생각할 것입니다. – Dolda2000

+0

임의의 생각 : 사용중인 포트가 무엇입니까? 그것을 바꿔보십시오. –

답변

2
com.server.ServeClient.run(ServeClient.java:33) 

나는 그것이 시도에서 일어나고 있다고 생각하지 않습니다.

IDE를 열고 디버깅을 사용 설정하고 진행 상황을 볼 수있을 때까지 단계별 실행을 수행하십시오. 그것은 당신이 놓친 것을 알아내는 가장 빠른 방법입니다.

당신이 가지고 있다고 생각하는 대상이 있습니다. 그것을 찾아라.

여기에 적절하게이 작업을 수행하는 방법의 예 :

http://www.kodejava.org/examples/216.html

+0

좋아,이 모든 버그를 시도하고 NullPointerException 스레드 클래스에서 start0() 메서드를 호출 한 후 발생합니다. 지금 나는 완전히 아무것도 이해하지 못한다. (( – poss

+0

) 당신이 그것을 디버그하려 했습니까? 당신이 사용하고있는 IDE는 무엇입니까? – duffymo

+0

Eclipse를 사용하고 있습니다. 내가 잘못 입력했습니다. OFC가 디버깅되었습니다. – poss

1

귀하의 문제가 정적 인스턴스 변수가 초기화되는 순서로합니다. 다음과 같이 시도하십시오.

... 
private static Vector clients = null; 
... 
if (clients==null) { 
    clients = new Vector(); // consider putting this in a synchronized block 
} 

클라이언트를 벡터에 추가하기 전에 시도하십시오.

+0

이 코드를 추가했는데, 't help (( – poss

+0

) 전혀 문제되지 않습니다. 정적 초기화 프로그램은 클래스가 초기화 될 때 실행됩니다. 클래스가 초기화되기 전에 특정 정적 코드가 실행되기 전에 실행됩니다. – Dolda2000

1

죄송합니다. 그런 오래된 문제는 괴롭 히지만이 문제가 해결되지 않은 것처럼 보였으므로 끝까지 약간의 정보를 제공해 드리겠습니다.

나는 비슷한 문제가 있었고 컴파일러는 문제가 start() 메소드에 있다고 계속 알려 주었다. 그러나 스레드 부분을 주석 처리하고 UI와 동일한 스레드에서 코드를 실행했을 때 컴파일러는 스레드의 코드 인 문제의 실제 소스로 안내해주었습니다.

코드에서 오류가 발생하지 않았 음을 확인한 후 코드를 원래 스레드 코드로 묶었으며 NullPointerException 오류를 표시하지 않게되었습니다.

호프가 도움이되기를 바랍니다.

0

JPanel에서 중복 클래스 선언을 제거하십시오.

주 응용 프로그램 창에서 시계를 업데이트 한 타이머 스레드를 실행하려고했습니다.

Eclipse/WindowBuilder를 사용하여 JFrame을 만들고 타이머를 만드는 방법에 대한 자습서를 따랐습니다. 텍스트 필드의 선언을 클래스 선언에 복사하여 전체 클래스에서 사용할 수있게했지만 위젯 정의 앞에있는 클래스 ID를 제거하는 것을 잊었습니다. 그래서 여전히 전역 인스턴스가 아닌 로컬 인스턴스를 초기화했습니다. 따라서 글로벌 하나에 액세스했을 때 여전히 null이었습니다.