2011-09-29 79 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代碼:

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調用run()方法

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) 

線33與第一行 「嘗試」 在ServeClient運行的語句()方法

+0

堆棧跟蹤告訴你在哪一行發生異常:ServeClient.java:33。哪條線?另外,你不應該使用==比較字符串。使用等於。 –

+0

該代碼在我的機器上運行。我幾乎會猜測你的Java安裝程序有什麼問題。 – Dolda2000

+0

隨機想法:是否在使用端口?嘗試改變它 –

回答

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

我不相信這是在嘗試發生。

打開一個IDE,打開調試,然後逐步瀏覽,直到看到發生了什麼。這是找出你錯過的最快方法。

有一個對象,你假設沒有。找到它。

下面是如何做到這一點正確的例子:

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

+0

好吧,我試圖bug的這一切,並調用start0()方法後,Thread類中發生NullPointerException。現在我不完全瞭解任何東西((( – poss

+0

)你的意思是你試圖調試它?你在用什麼IDE? – duffymo

+0

我使用Eclipse,sry我拼錯了,ofc我放了它 – poss

1

你的問題是在靜態實例變量被初始化的順序。嘗試做類似:

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

添加客戶端向矢量之前。

+0

我添加了這段代碼,它沒有(( – poss

+0

))這並不是問題,靜態初始化器在類初始化時運行,這肯定是在類被實例化之前,因此在運行它的任何非靜態代碼之前。 – Dolda2000

1

對不起這樣的舊問題,但似乎這個問題沒有解決,所以我會給我一點輸入從我的結尾。

我有一個類似的問題,編譯器也不斷告訴我,問題是在start()方法。但是,當我將線程部分註釋掉,並且只是在與UI相同的線程上運行代碼時,編譯器將我引向問題的真正來源:線程內的代碼。

在確定代碼沒有給出錯誤之後,我用原始線程代碼包含了代碼,並且它停止給我發出NullPointerException錯誤。

希望這可以幫助一路上的人。

0

刪除JPanel中的重複類聲明。

我正試圖運行一個計時器線程,更新主應用程序窗口中的時鐘。

我已經用Eclipse/WindowBuilder創建了JFrame,並且遵循了關於如何製作計時器的教程。我已將文本字段的聲明覆制到類聲明中,以使其可用於整個類,但忘記了在小部件定義前刪除類ID。所以它仍然初始化本地實例而不是全局實例。因此,當我訪問全球一個它仍然是空的。

相關問題