2012-08-02 63 views
0

在执行下面的代码时,我在关闭流时在try块中的类LoginAuthenticate中收到NullPointerException。NULL指针异常HTTP连接

我正在使用一个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 ; 
     } 
    } 
} 
+0

您是否在Manifest.xml中提供了Internet权限 – VenomVendor 2012-08-02 09:28:11

+0

尝试检查Log.e(“”,“buffer:”+ buffer)进入缓冲区的内容。 这将帮助您确定服务器端是否存在某些错误。 – 2012-08-02 09:56:02

回答

0

试试这个来处理null异常错误。

 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

+0

其实我总是无法理解我在doInbackGround中做了什么错误我正在使用stream和onPostExecute我正在更新它并通过getStreamBuffer()我正尝试在UI线程上使用它来更新UI,但每当它进入在try块中关闭流时捕获并重新调用NULL,所以每次抛出NULL指针异常所以基本上每次都要捕获块。 – 2012-08-02 08:04:53

0

有很多原因,HTTP返回空指针异常。 您的互联网不工作, 您正在访问的URL不存在或不存在。 在你的try catch块中,你正在做的错误是导致异常,你的catch块捕获每个异常总是返回空指针。

如果您在模拟器上进行测试,而且您确定该URL是正确的,并且代码没有任何问题,则可以取消/启用Internet连接,清理项目并重新构建,然后重新启动模拟器。 有时它修复了仿真器中的Internet问题。