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);