2011-08-26 124 views
1

我正在写处理中的UDP套接字的服务器端,并且每次在线DatagramPacket receivePacket = new DatagramPacket(receiveData, 4096);上遇到NullPointerException异常。客户端是一个Python文件。这是服务器的代码。通过不同的处理文件调用方法setup()draw()UDP套接字处理

import processing.net.*; 
import java.io.*; 
import java.net.*; 
import java.util.*; 

//Server myServer; 
DatagramSocket serverSocket; 
byte[] receiveData; 
InetAddress IPAddressList; 
int portList = -1; 

void setup(){ 
    try{ 
     DatagramSocket serverSocket = new DatagramSocket(21567); 
    } 
    catch (IOException e){ 
    e.printStackTrace(); 
    System.out.println(e); 
    } 

    byte[] receiveData = new byte[4096]; 
} 

void draw(){ 

    float P1,P2,P3; 
    print ("hello"); 
    try{ 
    DatagramPacket receivePacket = new DatagramPacket(receiveData, 4096); 
    serverSocket.receive(receivePacket); 
    String greeting = new String(receivePacket.getData()); 
    System.out.println("From Client: " + greeting); 
    IPAddressList = receivePacket.getAddress(); 
    portList= receivePacket.getPort(); 
    P1 = Integer.valueOf(greeting); 
    print(P1); 
    print (greeting); 
    } 
    catch (IOException e){ 
    System.out.println(e.getMessage()); 
    } 

    for (int i=0;i<receiveData.length;i++){ 
    print(receiveData[i]); 
    } 
} 

回答

5

您指出NullPointerException的行非常有帮助。

的问题是,你在外部范围初始化局部变量receiveData而不是领域receiveData

要解决的办法是简单地用receiveData = new byte[4096];替换行byte[] receiveData = new byte[4096];

在一般情况下,这就是所谓的名阴影:

+0

编辑代码就像你说的,我得到了'NullPointerException'下一行现在.. .serverSocket.receive(receivePacket);' – dawnoflife

+1

啊。与变量'serverSocket'相同的问题:不要在本地声明它。 – Nayuki

+0

明确地重申一下,你所做的是在'try'模块中创建变量'serverSocket'和'receiveData',它们与**命名的变量'serverSocket'和'receiveData'有**不同**以上在外部范围内。这种效果被称为名字遮蔽。 – Nayuki