Почему я получаю нулевое исключение в строке ds.getPort в классе L1? - PullRequest
0 голосов
/ 17 июня 2010
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();
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 17 июня 2010

Вы делаете это:

DatagramSocket ds;
Socket socket;

Draw d;
Paper p = new Paper(ds);

Здесь ds неинициализирован, то есть null.Бумага передает его в L1, поэтому ds в L1 также является нулевым.

1 голос
/ 17 июня 2010

Хорошо, вы представили там кучу кода, но у вас есть это:

DatagramSocket ds;
Socket socket;

Draw d;
Paper p = new Paper(ds);

Значением по умолчанию для полей ссылочного типа является ноль, поэтому вы фактически вызываете

new Paper(null)

Это в итоге вызовет

new L1(null)

, поэтому вызов ds.getPort() в L1 вызывает исключение.

Обратите внимание, что значение переменной передается в каждом случае - не то, чтобы ds в L1 ассоциировалось с полем ds в классе Draw.

Не вдаваясь в подробности,Трудно предложить простое исправление - но, скорее всего, потребуется подождать, пока вы не создадите DatagramSocket, прежде чем создавать Paper.

0 голосов
/ 17 июня 2010

Когда вы объявляете Paper p = new Paper(ds);, он инициализирует бумагу с нулевым DatagramSocket.

Я думаю, что вы хотите изменить эту строку на Paper p;, а затем сразу после ds = new DatagramSocket(localport); добавить p = new Paper(ds);

Просто на всякий случай, если вам интересно,Распространенным заблуждением в Java является то, что: если вы присваиваете new Paper(ds);, а потом изменяете ds (не любую из его переменных экземпляра, вы фактически изменяете весь ds как в: ds = newthing), манипулирование ссылкамив Java не означает, что экземпляр ds, первоначально использованный в статье, изменился.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...