-1

java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.Writer.write(java.lang.String)' on a null object reference 12-09 07:18:35.259 2419-2419/com.end.myapplication W/System.err:
at com.end.myapplication.MainActivity$SendingRunnable.run(MainActivity.java:124) 12-09 07:18:35.259 2419-2419/com.end.myapplication W/System.err:
at android.os.Handler.handleCallback(Handler.java:751) 12-09 07:18:35.259 2419-2419/com.end.myapplication W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95) 12-09 07:18:35.259 2419-2419/com.end.myapplication W/System.err: at android.os.Looper.loop(Looper.java:154) 12-09 07:18:35.259 2419-2419/com.end.myapplication W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6119) 12-09 07:18:35.259 2419-2419/com.end.myapplication W/System.err: at java.lang.reflect.Method.invoke(Native Method) 12-09 07:18:35.259 2419-2419/com.end.myapplication W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 12-09 07:18:35.259 2419-2419/com.end.myapplication W/System.err:
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

MainActivity

package com.end.myapplication;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

    private String html = "";
    private Handler mHandler;

    private Socket socket;

    private BufferedReader networkReader;
    private BufferedWriter networkWriter;

    private String ip = "192.168.56.1"; // IP
    private int port = 5516; // PORT번호

    boolean check=false;

    EditText et;
    TextView tv;
    NetworkThread thread;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et = (EditText) findViewById(R.id.EditText01);
        Button btn = (Button) findViewById(R.id.Button01);
        tv = (TextView) findViewById(R.id.TextView01);

        btn.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                if (et.getText().toString() != null || !et.getText().toString().equals("")) {
                    check=true;
                }
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        new Thread(){
            @Override
            public void run(){
                try {
                    socket = new Socket(ip, port);
                    networkWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                    networkReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }.start();
        thread = new NetworkThread(networkReader, networkWriter);
        thread.start();
    }

    private class NetworkThread extends Thread {
        BufferedReader br;
        BufferedWriter bw;
        Handler mHandler;
        SendingRunnable sendingRunnable;

        private NetworkThread(BufferedReader br, BufferedWriter bw){
            this.br = br;
            this.bw = bw;
            mHandler = new Handler();
            sendingRunnable = new SendingRunnable(bw);
        }

        @Override
        public void run() {
            super.run();
            boolean isError = false;
            String result = "";
            String error = "";

            try{
                this.bw.write("CONNECTED\n");
                this.bw.flush();
            }catch (Exception e){
                e.printStackTrace();
            }
            while (true){
                try{
                    if (check){
                        mHandler.post(sendingRunnable);

                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }

    private class SendingRunnable implements Runnable {
        BufferedWriter bw;

        private SendingRunnable(BufferedWriter bw){
            this.bw = bw;
        }

        @Override
        public void run() {
            String formula = et.getText().toString();
            try{
                bw.write(formula+"\n");
                bw.flush();
                et.setText("");
            }catch (Exception e){e.printStackTrace();}
        }
    }
}
MinnuKaAnae
  • 1,646
  • 3
  • 23
  • 35
Han
  • 9
  • 1
  • 3

2 Answers2

1

You are starting two threads simultaneously where the resources in second thread is being initialized by the first thread.

Solution: start the second thread from inside first thread

or

move the socket connection and reader, writer code in NetworkThread thread (no need of two threads)

Pavneet_Singh
  • 36,884
  • 5
  • 53
  • 68
-1

There is possibility of race condition in your Thread usage. Try removing former Thread.

Change

new Thread(){
        @Override
        public void run(){
            try {
                socket = new Socket(ip, port);
                networkWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                networkReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }.start();

to

try {
   socket = new Socket(ip, port);
   networkWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
   networkReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e1) {
    throw new AssertionError(e1);
}
ThomasEdwin
  • 2,035
  • 1
  • 24
  • 36
  • I try but java.lang.RuntimeException: Unable to resume activity {com.end.myapplication/com.end.myapplication.MainActivity}: android.os.NetworkOnMainThreadException – Han Dec 09 '17 at 08:23
  • Place break point in throw new AssertionError. Watch variable `e1` @Han – ThomasEdwin Dec 09 '17 at 09:56