Исключение указателя NULL HTTP-соединение

При выполнении приведенного ниже кода я получаю исключение NullPointerException в классе LoginAuthenticate в блоке try при закрытии потока.

Я использую AsyncTask и активирую его с помощью onClick на кнопке.

На onClick я вызываю авторизацию при входе и блокирую попытку получения исключения.

public class DattabActivity extends Activity implements View.OnClickListener {
    /** Called when the activity is first created. */    
    private final static String SERVICE_URI = "http://182.50.154.23/Dattab.Device.Rest/ServiceClass/RestDeviceService.svc";

        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.v("DEBUG", "DattabActivity");        
        setContentView(R.layout.login);
        Button loginbutton=(Button)findViewById(R.id.loginbtn);
        loginbutton.setOnClickListener(this);

        Intent available=new Intent();
        available.setClass(DattabActivity.this, Available_Surveys.class);         

    }

    public void onClick(View v) {
        switch(v.getId()){

        case R.id.loginbtn:
            // TODO Auto-generated method stub
            EditText userid = (EditText)findViewById(R.id.useredt);
            EditText passwd = (EditText)findViewById(R.id.pwdedt);

            Log.i("DEBUG", "DattabActivity Click Button ");

            userid.setText("surveyor1");
            passwd.setText("dev");
            if(userid.getText().toString()=="" ||passwd.getText().toString()==""){

                Toast.makeText(getApplicationContext(), "Please enter your account details", Toast.LENGTH_LONG).show();
            }
            else{
                    String params = SERVICE_URI + "/authenticateuser/"+userid.getText().toString()+"/"+passwd.getText().toString();
                    try {
                            LoginAuthenticate la = new LoginAuthenticate();
                            la.execute(params);
                            la.get();


                        JSONObject json = new JSONObject(new String(la.getStreamBuffer()));
                        Intent available=new Intent();
                        available.setClass(DattabActivity.this, Available_Surveys.class);
                        available.putExtra("userid", json.getString("SurveyorId"));
                        startActivity(available);
                        Toast.makeText(getApplicationContext(), json.getString("SurveyorId"),Toast.LENGTH_LONG).show();
                        Toast.makeText(getApplicationContext(), "Login Clicked", Toast.LENGTH_LONG).show();
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    catch(Exception e){
                        e.printStackTrace();
                    }



            }

            break ;
        }

    }
    private class LoginAuthenticate extends AsyncTask<String,Integer,char[]> {
        private char[] streamBuffer ;
        @Override
        protected char[] doInBackground(String... params) {
            android.os.Debug.waitForDebugger();

            String url=params[0];
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpGet request = new HttpGet(url);
            try {
                    request.setHeader("Accept", "application/json");
                    request.setHeader("Content-type", "application/json");
                    HttpResponse response = httpClient.execute(request);
                    HttpEntity responseEntity = response.getEntity();

                    // Read response data into buffer
                    char[] buffer = new char[(int)responseEntity.getContentLength()];
                    InputStream stream = responseEntity.getContent();
                    InputStreamReader reader = new InputStreamReader(stream);
                    reader.read(buffer);
                    stream.close();//here it goes in catch NULL Pointer
                    return buffer ;

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

        }
        protected void onPostExecute(char[] result){
            streamBuffer = result ;
        }

        public char[] getStreamBuffer(){
            return streamBuffer ;
        }
    }
}

person Kumar Vishal    schedule 02.08.2012    source источник
comment
Вы дали разрешение на доступ в Интернет в Manifest.xml   -  person VenomVendor    schedule 02.08.2012
comment
Попробуйте проверить, что вы попали в буфер с помощью Log.e (, buffer: + buffer); Это поможет вам убедиться, есть ли ошибка на стороне сервера.   -  person Parth Dani    schedule 02.08.2012


Ответы (2)


Попробуйте это, чтобы обработать ошибку нулевого исключения.

        try {
                request.setHeader("Accept", "application/json");
                request.setHeader("Content-type", "application/json");
                HttpResponse response = httpClient.execute(request);
                HttpEntity responseEntity = response.getEntity();

                // Read response data into buffer
                char[] buffer = new char[(int)responseEntity.getContentLength()];
                try{
                      InputStream stream = responseEntity.getContent();
                       InputStreamReader reader = new InputStreamReader(stream);
                        reader.read(buffer);
                 }
                 finally{
                       stream.close();//here it goes in catch NULL Pointer
                  }
                return buffer ;

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

Ссылка: https://stackoverflow.com/a/156889/1503155

person Lazy Ninja    schedule 02.08.2012
comment
На самом деле я всегда не могу понять, что я делаю неправильно в doInbackGround. Я беру поток, а onPostExecute обновляю его, и через getStreamBuffer () я пытаюсь использовать его в потоке пользовательского интерфейса для обновления пользовательского интерфейса, но каждый раз, когда он попадает в ловушку при закрытии потока в блоке try и повторно запускать NULL, чтобы каждый раз генерировать исключение указателя NULL. Итак, основное, почему он каждый раз переходит в блок catch. - person Kumar Vishal; 02.08.2012

Есть много причин, по которым HTTP возвращает исключение с нулевым указателем. Ваш Интернет не работает, URL-адрес, который вы нажимаете, не существует или больше не существует. В вашем блоке try catch вы делаете что-то не так, что вызывает исключение, и ваши блоки catch улавливают каждое исключение, всегда возвращающее нулевой указатель.

Если вы тестируете эмулятор и уверены, что URL-адрес правильный и в вашем коде все в порядке, вы можете отключить / включить подключение к Интернету, очистить проект и перестроить, а также перезапустить эмулятор. Иногда это решает проблему с Интернетом в эмуляторе.

person Adeel Pervaiz    schedule 02.08.2012