Java 为什么在L1类的ds.getPort行中会出现nullpointerexception?
好吧,您在那里展示了相当混乱的代码,但您有以下几点:Java 为什么在L1类的ds.getPort行中会出现nullpointerexception?,java,nullpointerexception,Java,Nullpointerexception,好吧,您在那里展示了相当混乱的代码,但您有以下几点: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.net.*; import java.util.*; public class Draw extends JFrame { /* * Socket stuff */ static String host;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
import java.util.*;
public class Draw extends JFrame {
/*
* Socket stuff
*/
static String host;
static int port;
static int localport;
DatagramSocket ds;
Socket socket;
Draw d;
Paper p = new Paper(ds);
public Draw(int localport, String host, int port) {
d = this;
this.localport = localport;
this.host = host;
this.port = port;
try {
ds = new DatagramSocket(localport);
InetAddress ia = InetAddress.getByName(host);
System.out.println("Attempting to connect DatagramSocket. Local port "
+ localport + " , foreign host " + host + ", foreign port " + port + "...");
ds.connect(ia, port);
System.out.println("Success, ds.localport: " + ds.getLocalPort()
+ ", ds.port: " + ds.getPort() + ", address: " + ds.getInetAddress());
Reciever r = new Reciever(ds);
r.start();
} catch (Exception e) {
e.printStackTrace();
}
setDefaultCloseOperation(EXIT_ON_CLOSE);
getContentPane().add(p, BorderLayout.CENTER);
setSize(640, 480);
setVisible(true);
}
public static void main(String[] args) {
int x = 0;
for (String s : args){
if (x==0){
localport = Integer.parseInt(s);
x++;
}
else if (x==1){
host = s;
x++;
}
else if (x==2){
port = Integer.parseInt(s);
}
}
Draw d = new Draw(localport, host, port);
}
}
class Paper extends JPanel {
DatagramSocket ds;
private HashSet hs = new HashSet();
public Paper(DatagramSocket ds) {
this.ds=ds;
setBackground(Color.white);
addMouseListener(new L1(ds));
addMouseMotionListener(new L2());
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.black);
Iterator i = hs.iterator();
while(i.hasNext()) {
Point p = (Point)i.next();
g.fillOval(p.x, p.y, 2, 2);
}
}
private void addPoint(Point p) {
hs.add(p);
repaint();
}
class L1 extends MouseAdapter {
DatagramSocket ds;
public L1(DatagramSocket ds){
this.ds=ds;
}
public void mousePressed(MouseEvent me) {
addPoint(me.getPoint());
Point p = me.getPoint();
String message = Integer.toString(p.x) + " " + Integer.toString(p.y);
System.out.println(message);
try{
byte[] data = message.getBytes("UTF-8");
//InetAddress ia = InetAddress.getByName(ds.host);
String convertedMessage = new String(data, "UTF-8");
System.out.println("The converted string is " + convertedMessage);
DatagramPacket dp = new DatagramPacket(data, data.length);
System.out.println(ds.getPort());
//System.out.println(message);
//System.out.println(ds.toString());
//ds.send(dp);
/*System.out.println("2Sending a packet containing data: " +data +" to "
+ ia + ":" + d.port + "...");*/
} catch (Exception e){
e.printStackTrace();
}
}
}
class L2 extends MouseMotionAdapter {
public void mouseDragged(MouseEvent me) {
addPoint(me.getPoint());
Point p = me.getPoint();
String message = Integer.toString(p.x) + " " + Integer.toString(p.y);
//System.out.println(message);
}
}
}
class Reciever extends Thread{
DatagramSocket ds;
byte[] buffer;
Reciever(DatagramSocket ds){
this.ds = ds;
buffer = new byte[65507];
}
public void run(){
try {
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while(true){
try {
ds.receive(packet);
String s = new String(packet.getData());
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
引用类型字段的默认值为null,因此您实际上是在调用
DatagramSocket ds;
Socket socket;
Draw d;
Paper p = new Paper(ds);
那最后会打电话给你
new Paper(null)
这就是为什么在L1中调用ds.getPort()
会引发异常
请注意,在每种情况下都会传递变量的值-这不像L1中的ds
与Draw
类中的ds
字段相关联
如果不看更多的细节,就很难提出一个简单的解决方案,但很可能需要等到创建了DatagramSocket
之后,再创建文件您可以这样做:
new L1(null)
在这里,ds未初始化,因此为空。纸张将其传递给L1,因此L1中的ds也为空。当您声明纸张p=新纸张(ds)代码>它使用空DatagramSocket初始化纸张
我想你要做的是把那行改成Paper p代码>然后紧接着ds=newdatagramsocket(localport)代码>添加p=新纸张(ds)代码>
如果您想知道,Java中一个常见的误解是:如果您分配新论文(ds)
之后您更改了ds(不是它的任何实例变量,实际上您更改了整个ds,如:ds=new something),Java中的引用操作并不意味着最初在本文中使用的ds实例发生了更改
DatagramSocket ds;
Socket socket;
Draw d;
Paper p = new Paper(ds);