2012-10-17 35 views
2

我試圖做一個http請求來連接一個應用程序,並進行身份驗證procedure.But我得到NullpointerException。連接對象無法獲取流數據。這是造成空指針異常。這裏是我的代碼
NullPointerException。無法通過流讀取

String api="URL of the application"; 
    String query="format=json"; 

    //Necessary Variables 
    String publicKey=publickey; 
    String privateKey=privatekey; 
    String email=uemail; 
    String password=upassword; 
    String algo="HmacSHA1"; 
    //identify Application 
    long time=System.currentTimeMillis()/1000; 
    SecretKeySpec sks=new SecretKeySpec(privateKey.getBytes(),algo); 
    try { 
     Mac mac=Mac.getInstance(algo); 
     mac.init(sks); 
     String hash=""; 
     byte[] digest=mac.doFinal((query+time).getBytes()); 
     for (byte b : digest) { 
      hash +=String.format("%02x", b); 

     } 
     //Make the request 
     String url=api+"?"+query+"&apikey="+publicKey+"&hash="+hash+"&t="+time; 
     Log.d("URL", "url: "+url); 

     try { 
      HttpsURLConnection c=(HttpsURLConnection) new URL(url.trim()).openConnection(); 
      c.setRequestProperty("Authorization","Basic "+DatatypeConverter.printBase64Binary((email+":"+password).getBytes())); 
      InputStream iStream=null; 
      try { 

       ***iStream=c.getInputStream();*** 
      } catch (Exception e) { 

       iStream=c.getErrorStream(); 
      } 

      InputStreamReader iStreamReader=new InputStreamReader(iStream); 
      BufferedReader bReader=new BufferedReader(iStreamReader); 
      String result=""; 
      String line=""; 
      while ((line=bReader.readLine())!=null) { 
       result +=line+"\n"; 
      } 

     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } catch (NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InvalidKeyException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

這是異常。

10-17 11:09:38.127: E/AndroidRuntime(864): FATAL EXCEPTION: main 
10-17 11:09:38.127: E/AndroidRuntime(864): java.lang.NullPointerException 
10-17 11:09:38.127: E/AndroidRuntime(864): at libcore.net.http.HttpEngine.writeRequestHeaders(HttpEngine.java:646) 
10-17 11:09:38.127: E/AndroidRuntime(864): at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:800) 
10-17 11:09:38.127: E/AndroidRuntime(864): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:274) 
10-17 11:09:38.127: E/AndroidRuntime(864): at libcore.net.http.HttpURLConnectionImpl.getErrorStream(HttpURLConnectionImpl.java:100) 
10-17 11:09:38.127: E/AndroidRuntime(864): at libcore.net.http.HttpsURLConnectionImpl.getErrorStream(HttpsURLConnectionImpl.java:124) 
10-17 11:09:38.127: E/AndroidRuntime(864): at com.arc.distimoapp.LoginScreen.loginDistimo(LoginScreen.java:113) 
10-17 11:09:38.127: E/AndroidRuntime(864): at com.arc.distimoapp.LoginScreen$1.onClick(LoginScreen.java:62) 
10-17 11:09:38.127: E/AndroidRuntime(864): at android.view.View.performClick(View.java:4084) 
10-17 11:09:38.127: E/AndroidRuntime(864): at android.view.View$PerformClick.run(View.java:16966) 
10-17 11:09:38.127: E/AndroidRuntime(864): at android.os.Handler.handleCallback(Handler.java:615) 
10-17 11:09:38.127: E/AndroidRuntime(864): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-17 11:09:38.127: E/AndroidRuntime(864): at android.os.Looper.loop(Looper.java:137) 
10-17 11:09:38.127: E/AndroidRuntime(864): at android.app.ActivityThread.main(ActivityThread.java:4745) 
10-17 11:09:38.127: E/AndroidRuntime(864): at java.lang.reflect.Method.invokeNative(Native Method) 
10-17 11:09:38.127: E/AndroidRuntime(864): at java.lang.reflect.Method.invoke(Method.java:511) 
10-17 11:09:38.127: E/AndroidRuntime(864): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
10-17 11:09:38.127: E/AndroidRuntime(864): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-17 11:09:38.127: E/AndroidRuntime(864): at dalvik.system.NativeStart.main(Native Method) 
+1

你的問題在於低兩行,'.getErrorStream()'函數根據堆棧跟蹤拋出一個NPE。但是,這是真的,該行被執行,因爲'c.getInputStream()'行引發了一個異常。我建議記錄原始異常,它可能會提供一些關於正在發生的事情的細節。 – ppeterka

+0

字符串不是二進制數據的容器。您應該將您的公鑰和私鑰作爲字節數組使用:不要將它們轉換爲字符串,也不要將它們轉換爲字符串。往返旅程無處不保證無損。 – EJP

+0

@EJP應用程序Api已經提到使用String作爲公鑰和私鑰的持有者。 – Mufrah

回答

2

我的代碼中的一些修改使我能夠實現目標。首先,我在catch體中添加e.printstacktrack。

try { 
     Log.d(TAG, "Trying to get the input stream.."); 
     iStream=c.getInputStream(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     iStream=c.getErrorStream(); 
} 

這讓我知道新exception.which是

android.os.NetworkOnMainThreadException .............. 

而這個例外是通過把你在一個線程

  Thread t = new Thread(){ 
      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       try { 
        HttpsURLConnection c=(HttpsURLConnection) new URL(url.trim()).openConnection(); 

        Log.d(TAG, "Parameter value is " + "Basic " + DatatypeConverter.printBase64Binary((email+":"+password).getBytes())); 

        c.setRequestProperty("Authorization","Basic "+DatatypeConverter.printBase64Binary((email+":"+password).getBytes())); 
        InputStream iStream=null; 
        try { 
         Log.d(TAG, "Trying to get the input stream.."); 

         iStream=c.getInputStream(); 
        } catch (Exception e) { 

         e.printStackTrace(); 

         iStream=c.getErrorStream(); 
        } 

        Log.d(TAG, "Trying to read..."); 
        InputStreamReader iStreamReader=new InputStreamReader(iStream); 

        Log.d(TAG, "Buffering..."); 
        BufferedReader bReader=new BufferedReader(iStreamReader); 
        String result=""; 
        String line=""; 

        Log.d(TAG, "About to parse results..."); 
        while ((line=bReader.readLine())!=null) { 
         Log.d(TAG, "Line is " + line); 
         result +=line+"\n"; 

        } 

        Log.d(TAG, "Output is: " + result); 

       } catch (MalformedURLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       }     

       super.run(); 
      } 

     }; 

     t.start(); 

現在,它的做工精細的代碼解決。