Java NullPointerException, пожалуйста, помогите мне понять, почему - PullRequest
2 голосов
/ 10 мая 2011

РЕДАКТИРОВАТЬ: Проблема у меня была в том, что я использовал неправильный сокет. Теперь это решено.

Привет

Я работаю над небольшим клиентом чата в Java, который включает программирование сокетов. Однако у меня возникла небольшая проблема с установлением соединения, потому что я получил исключение NullPointerException и не могу понять, почему!

Это код, создающий проблемы:

        try {
            sock = new Socket(host, port);
            Connection DaUberConnection = new Connection(sock);
        } catch (UnknownHostException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

Переменные, используемые для создания сокета, объявляются на уровне класса и полностью работают как задумано (я думаю). Хост и порт установлены.

Socket sock;
String host;
int port;

Я понимаю, что это как-то связано с тем, что я выбрасываю ноль в неположенном месте, но не могу понять, как все это сваливается.

Извините за мой плохой английский или nubieness в Java :) Было бы золото, если бы кто-нибудь мог объяснить, почему это происходит!

Полная ошибка:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at clientpackage.Connection.<init>(Connection.java:24)
at clientpackage.Client$1.actionPerformed(Client.java:91)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Ответы [ 2 ]

1 голос
/ 10 мая 2011

Я думаю, что проблема в том, что вы не создали и не развернули тот же код, что и в вашем вопросе.

  • Вы говорите, что исключение возникает в этой строке:

    in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
    

    и это означает, что sock ДОЛЖЕН быть нулевым.

  • Но это называется здесь:

    sock = new Socket(host, port);  // 1
    Connection DaUberConnection = new Connection(sock); // 2
    

    , и это означает, чтоsock НЕ МОЖЕТ быть нулевым ... если только что-то не происходит.

Если код, который вы запускаете , действительно равен , как вы сообщали, единственнымВозможное объяснение этих симптомов: если какой-то другой поток назначает null на sock в крошечном окне между двумя операторами (1 и 2).Даже если предположить, что какой-то другой поток может обновить sock, это событие произойдет только "один раз в голубой луне".


Вернитесь в свою среду разработки и сохраните все файлы, которые выредактируете, очищаете все файлы ".class", полностью собираете и запускаете приложение заново.


Мне кажется, я вижу вашу проблему ... s против sock.

Это хорошая иллюстрация того, почему ПЛОХАЯ ПРАКТИКА для класса представляет свои переменные состояния подклассам.Переменная экземпляра sock должна иметь значение private, а подкласс должен использовать для ее получения метод получения и инициализировать его через цепочку конструктора.

Поспи немного, а завтра начни с исправления этой ошибки в дизайне.

0 голосов
/ 10 мая 2011

Разделите строку 24.

Используйте

if (sock==null) System.out.println ("Sock is null");
else {
    is = sock.getInputStream(); 
    if (is==null) System.out.println ("inputStream is null");
    else isr = InputStreamReader(is);
}

и посмотрите, какой из них равен нулю.Для чего эта линия?

Connection DaUberConnection = new Connection(sock);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...