为何获得NullPointerException
?当我从服务器向客户端发送数据时,一切正常。
Error java.lang.NullPointerException
at NetworkClient.Klient.wyslijDane(Klient.java:35)
编辑代码 我添加了完整的服务器类和客户端类 在其他类中,我创建一个新的对象客户端和服务器
klient = new Klient(); 然后调用方法WyslijDane。服务器没问题,客户端抛出异常。
客户等级
public class Klient {
public static final int PORT=50007;
public static Socket sock;
public static int msg=10;
public Klient() throws UnknownHostException, IOException
{
Socket sock=new Socket("localhost", PORT);
}
public static void wyslijDane(int GraczK) throws IOException
{
DataInputStream in=new DataInputStream(sock.getInputStream());
DataOutputStream out=new DataOutputStream(sock.getOutputStream());
// BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
out.writeInt(GraczK);
//out.writeBoolean(flaga);
out.flush();
System.out.println("Wyslano dane "+ GraczK );
}
}
服务器类
public class Server
{
public static final int PORT=50007;
public static MainWarSever main=new MainWarSever();
static Socket sock;
public Server() throws IOException
{
//tworzenie gniazda serwerowego
ServerSocket serv = null;
if (serv==null)
serv=new ServerSocket(PORT);
else
{
System.out.println("SErver już zajety brrrr");
serv.close();
}
sock=serv.accept();
System.out.println("Jest polaczenie: "+sock);
}
public static void wyslijDane(int GraczK) throws IOException
{
DataInputStream in=new DataInputStream(sock.getInputStream());
DataOutputStream out=new DataOutputStream(sock.getOutputStream());
boolean flaga=true;
int msg;
int i=0;
int msgOut;
msgOut=GraczK;
out.writeInt(msgOut);
out.writeBoolean(flaga);
out.flush();
System.out.println("Wyslano dane "+ GraczK + "Flage" + flaga);
}
答案 0 :(得分:1)
sock
设置为什么?如果sock
不是NullPointerException的原因,那么带行号的代码会很有帮助。
编辑:在您添加完整的源代码之后......在调用静态wyslijDane(int GraczK)
时,您的Klient()
构造函数设置sock一定不能被调用。使你的变量和方法不是静态的可以澄清这一点。
编辑:BTW在您的客户端类中定义两个 sock变量,一个是静态的,一个在构造函数中,后者在离开构造函数后被销毁。
答案 1 :(得分:1)
1)您收到NullPointerException
,因为当您说sock.getOutputStream()
或sock.getInputStream()
时,您正在使用sock
在构造函数外部声明的变量未初始化。
因此,不要在构造函数中创建新的sock
变量,而是使用已有的变量:
//Change this line
Socket sock=new Socket("localhost", PORT);
//To this
Socket sock=new Socket("localhost", PORT);
2)你的sock变量不应该被声明为static
,并且在执行构造函数(创建套接字)之后应该调用wyslijDane
所以它不应该是静态的
3)确保在创建wyslijDane
后调用Socket
方法。
4)首先创建并刷新DataOutputStream
,然后创建DataInputStream
。它们在客户端和服务器代码中的顺序应该相同:
DataOutputStream out=new DataOutputStream(sock.getOutputStream());
out.flush();
DataInputStream in=new DataInputStream(sock.getInputStream());
由于您说创建DataOutputStream
时会抛出异常,因此应该解决问题。
建议:
作为一种良好做法,每次调用DataOutputStream
方法时都不要创建DataInputStream
和wyslijDane
。
而是在创建套接字后立即创建DataOutputStream
和DataInputStream
。