마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 초보입니다 오류를 찾아주시면 너무나도 감사드리겠습니다...

0 추천

간단한 소켓 서버를 만들어봤는데 NullPointerException, RuntimeException등의 오류가 생기네요

완전 초보라서 밤새도록 붙잡고있었는데 잘 모르겠습니다 도와주세요 ㅠㅠ 

11-30 08:39:53.911 8134-8134/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                 Process: com.example.tcpiptest2, PID: 8134
                                                 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.tcpiptest2/com.example.tcpiptest2.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2814)
                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2978)
                                                     at android.app.ActivityThread.-wrap14(ActivityThread.java)
                                                     at (생략....)

 

public class TCPServer implements Runnable {

        public static final int ServerPort = 4545;

        public static final String ServerIP = "192.168.43.74";

        @Override
        public void run() {
            try {
                tv2.setText("S: Connecting...");

                ServerSocket serverSocket = new ServerSocket(ServerPort);

                while (true) {

                    Socket client = serverSocket.accept();

                    tv2.setText("S: Receiving...");

                    try {

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

                        String str = in.readLine();

                       tv2.setText("S: Received: '" + str + "'");

                        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);

                        out.println("Server Received adfasdfa " + str);

                    } catch (Exception e) {

                        tv2.setText("S: Error");

                        e.printStackTrace();

                    } finally {

                        client.close();

                        tv2.setText("S: Done.");

                    }

                }

            } catch (Exception e) {

                tv2.setText("S: Error");

                e.printStackTrace();

            }

        }
    }
}

김돌격 (230 포인트) 님이 2017년 11월 30일 질문
김돌격님이 2017년 11월 30일 수정

1개의 답변

+1 추천
 
채택된 답변

TextView tv2 = (TextView)findViewId(R.id.TextView2); 호출 위치가 잘 못 되었습니다.

Activity의 경우 livecycle 이 있으며, onCreate 시 view 의 정보가 들어가는데, 

onCreate 밖에서 호출하셔서 오류가 났습니다.

TextView tv2 = (TextView)findViewId(R.id.TextView2); 대신 

TextView tv2; 같이 선언만 하시고,

데이터 초기화는 onCreate 안에서 Button 값 주는것과 동일하게,

tv2 =  (TextView)findViewId(R.id.TextView2); 를 호출하는 방식으로 변경 하세요.

(가급적이면 Button btn도 onCreate 밖에서 선언하고, onCreate에서 값을 세팅 하시는 방식으로 변경하시는게 좋을 듯 합니다.)

익명사용자 님이 2017년 11월 30일 답변
김돌격님이 2017년 12월 1일 채택됨
오오오오오오오 너무나 감사드립니다 ㅠㅠ 정말 감사드립니다 ㅠㅠㅠ
...