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();
}
}
}
-1
A
回答
1
好,你提出的代码相当混乱那里,但你有这样的:
DatagramSocket ds;
Socket socket;
Draw d;
Paper p = new Paper(ds);
为引用类型字段的默认值是零,所以你打电话有效
new Paper(null)
那么这将最终调用
new L1(null)
这是为什么打电话L1中的正在抛出异常。该变量的值在每种情况下被传递
注 - 它不是像内的L1 ds
与在Draw
类的ds
字段相关联。
没有看更多的细节,很难提出一个简单的解决方案 - 但它可能会涉及到等待,直到您创建DatagramSocket
,然后再创建Paper
。
2
你这样做:
DatagramSocket ds;
Socket socket;
Draw d;
Paper p = new Paper(ds);
这里,ds是未初始化的,因而无效。纸将它传递给L1,因此L1中的ds也是空的。
0
当您声明Paper p = new Paper(ds);
时,它将使用空DatagramSocket初始化纸张。
我想你想要做的是到该行更改为Paper p;
然后之后ds = new DatagramSocket(localport);
添加p = new Paper(ds);
刚抬起头的情况下,你想知道,Java中的一个常见的误解是:如果你分配new Paper(ds);
和你以后的更改 ds(不是它的任何实例变量,你实际上改变了整个ds,如ds = new something),Java中的引用操作并不意味着最初用在纸上的ds实例会改变。
相关问题
- 1. 为什么我的BigInteger.add()会得到NullPointerException?
- 2. 为什么我得到一个NullPointerException?
- 3. 为什么我得到一个NullPointerException?
- 4. 为什么我会得到NullPointerException?
- 5. 为什么我会得到NullPointerException?
- 6. 我为什么会得到nullPointerException
- 7. 为什么我得到NullPointerException
- 8. 自定义ArrayAdapter:为什么我会得到一个NullPointerException?
- 9. 为什么我会得到一个nullpointerexception(Android)?
- 10. Java - 为什么我得到这个NullPointerException?
- 11. 为什么我得到这个NullPointerException?
- 12. 为什么我会得到一个nullpointerexception,可能是类错误(Android)?
- 13. 为什么我在ImageView上得到NullPointerException?
- 14. 我得到一个nullpointerexception,我找不到为什么
- 15. 为什么我得到一个NullPointerException与我的数组?
- 16. 为什么我会得到一个GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT?
- 17. 为什么我会得到一个java.nio.BufferOverflowException
- 18. 为什么我在这里得到一个NullPointerException?
- 19. 为什么我在getDir上得到一个NullPointerException?
- 20. 为什么我在这段代码中得到一个NullPointerException
- 21. 我得到一个NullPointerException,我不明白为什么
- 22. 为什么我会在Synchronized Lock上得到NullPointerException?
- 23. 为什么我得到NullPointerException错误?
- 24. 为什么我没有得到NullPointerException
- 25. 为什么我从EditText android得到NullPointerException?
- 26. 为什么我会用看似简单的StringTemplate代码来得到一个NullPointerException?
- 27. 不知道为什么我得到一个NullPointerException错误
- 28. 为什么我得到一个NullPointerException错误?
- 29. 不知道为什么我得到一个NullPointerException
- 30. 为什么我得到一个NullPointerException与执行预准备语句的代码?