2012-10-17 75 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(); 

现在,它的做工精细的代码解决。