2011-05-10 3 views
2

편집 : 내가 가지고 있었던 문제는 내가 잘못된 소켓을 사용하고 있다는 것이 었습니다. 이제 해결되었습니다.Java NullPointerException, 왜 이해가 도와주세요

안녕,

나는 소켓 프로그래밍을 포함 자바에있는 작은 채팅 클라이언트에서 일하고 있습니다. 그러나 나는 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; 

나는 그것이 나를 어딘가 잘못된 위치에 널에 던지는 함께 할 수있는 뭔가가 있음을 이해하지만이 모두 함께 걸려 어떻게 정말 볼 수 없습니다.

죄송합니다. 내 영어 나 니스가 자바로 작성되었습니다. 왜 이런 일이 일어 났는지 설명 할 수 있다면 금이됩니다!

전체 오류 :

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) 
+1

'host'의 값을 설정 한 적이 있습니까? 그렇지 않다면,'host'는 null이되어 예외가 발생할 것입니다. – debracey

+1

Connection.java의 라인 24는 무엇입니까? –

+0

예 "localhost"인 호스트에 대한 값을 설정했습니다. – Ms01

답변

1

문제는 귀하가 작성한 동일한 코드를 작성하고 배포하지 않은 것입니다.

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

을하고 그 sock가 null되어야 함을 의미 :

  • 당신은 예외가이 라인에서 발생하는 것을 말한다.

  • 그러나 여기에서 호출됩니다

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

    그것은 뭔가 다른 일이 벌어하지 않는 sock이 ... null이 될 수 없음을 의미합니다. 당신이 을 실행하는 코드가 정말보고로 경우 다른 스레드가 두 문장 사이의 작은 창에 socknull를 할당하는 경우

, 그 증상이 유일하게 가능한 설명은 (1입니다 및 2). 다른 스레드가 있다고 가정해도 업데이트 sock으로 업데이트되며이 이벤트는 "파란색 달에 한 번만"발생합니다.


, 편집중인 모든 파일을 저장하고, 다시 개발 환경으로 이동 "을 .class"파일, 전체 빌드를 모두 정리하고 다시 응용 프로그램을 통해 실행

.


은 내가 당신의 문제 ... socks을 볼 생각합니다.

이것은 클래스가 상태 변수를 서브 클래스에 노출시키는 것이 나쁜 판단 (BAD PRACTICE) 이유에 대한 좋은 예입니다. sock 인스턴스 변수는 private이어야하며 하위 클래스는 액세스하기 위해 getter를 사용해야하며 생성자 체인을 통해 초기화해야합니다.

수면을 취한 다음 내일이 디자인 결함을 수정하여 시작하십시오.

+0

이것은 현재 상태 인 Connection.java입니다. http://pastie.org/private/jec4n2s22c6hm5aj10ts3a – Ms01

+0

흠, 연결에서 양말을 사용할 수 있도록 클라이언트를 확장 한 것을 잊어 버렸습니다. 내가 사용해야하는 소켓은 물론 양말이 아닌 "s"입니다. 미안 나는 피곤하다! :디 – Ms01

0

별도의 라인 (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); 
} 

및 null의 어느 쪽을 참조하십시오. 이 라인은 무엇입니까?

+1

'getInputStream()'은 null을 반환 할 수 없습니다. 이것은 목적이 없습니다. 'sock'은 null입니다. –

+0

@Brian 네 말이 맞아. 문서를 읽어 들일 때, Socket은 스트림을 생성 할 수 없다면 IOException을 던집니다. 방금 null을 반환했다고 가정했습니다. – Aleadam

관련 문제