1

新的Android编程。NullPointerException:解析XML,从ByteArrayInputStream创建InputStream(string.getBytes())

的空指针是发生在这条线:

String toBeConverted = XmlFile(myURL, "[email protected]", 
       "password"); 
    InputStream is = new ByteArrayInputStream(toBeConverted.getBytes()); 

这里是我用得到的字符串,这是工作,因为我正在从服务器正确的响应方法

06-20 15:15:40.804: I/RESPONSE(2270): <?xml version="1.0" encoding="utf-8"?> 
06-20 15:15:40.804: I/RESPONSE(2270): <CarObject> 
06-20 15:15:40.804: I/RESPONSE(2270): <ResultCode>0</ResultCode> 
06-20 15:15:40.804: I/RESPONSE(2270): <ResultMessage>success</ResultMessage> 
06-20 15:15:40.804: I/RESPONSE(2270): <Cardata xsi:type="ArrayOfCarStatus"> 
06-20 15:15:40.804: I/RESPONSE(2270):  <CarStatus> Car 
06-20 15:15:40.804: I/RESPONSE(2270):  <CarID>241</CarID> 
06-20 15:15:40.804: I/RESPONSE(2270):  <CarName>ASC</CarName> 
06-20 15:15:40.804: I/RESPONSE(2270):  </CarStatus> 
06-20 15:15:40.804: I/RESPONSE(2270): </CarData> 
06-20 15:15:40.804: I/RESPONSE(2270): </CarObject> 

这里是我用来得到XML的方法

public String XmlFile(String url, String username, String password) { 

     try { 

      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(url); 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 

      nameValuePairs.add(new BasicNameValuePair("user", username)); 
      nameValuePairs.add(new BasicNameValuePair("password", password)); 

      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      HttpResponse response = httpclient.execute(httppost); 

      HttpEntity resEntity = response.getEntity(); 

      Log.i("RESPONSE", EntityUtils.toString(resEntity)); 
      return EntityUtils.toString(resEntity); 

     } catch (ClientProtocolException e) { 

      Log.e("Log, ClientProtocol Exception", e.toString()); 
     } catch (IOException e) { 
      Log.e("Log, IO Exception", e.toString()); 
     } catch (IllegalArgumentException e) { 
      Log.e("Log, IllegalArgument Exception", e.toString()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     Log.e("a", "XmlFile returning null string"); 
     return null; 

    } 

LogCat:

06-20 15:15:40.819: W/System.err(2270):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
06-20 15:15:40.819: W/System.err(2270):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
06-20 15:15:40.819: W/System.err(2270):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-20 15:15:40.819: W/System.err(2270):  at android.os.Looper.loop(Looper.java:137) 
06-20 15:15:40.819: W/System.err(2270):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
06-20 15:15:40.819: W/System.err(2270):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-20 15:15:40.827: W/System.err(2270):  at java.lang.reflect.Method.invoke(Method.java:511) 
06-20 15:15:40.827: W/System.err(2270):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
06-20 15:15:40.827: W/System.err(2270):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
06-20 15:15:40.827: W/System.err(2270):  at dalvik.system.NativeStart.main(Native Method) 
06-20 15:15:40.827: E/a(2270): XmlFile returning null string 
06-20 15:15:40.827: D/AndroidRuntime(2270): Shutting down VM 
06-20 15:15:40.827: W/dalvikvm(2270): threadid=1: thread exiting with uncaught exception (group=0x40ccc930) 
06-20 15:15:40.835: E/AndroidRuntime(2270): FATAL EXCEPTION: main 
06-20 15:15:40.835: E/AndroidRuntime(2270): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bentseytlin.maps/com.bentseytlin.maps.MainActivity}: java.lang.NullPointerException 
06-20 15:15:40.835: E/AndroidRuntime(2270):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
06-20 15:15:40.835: E/AndroidRuntime(2270):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
06-20 15:15:40.835: E/AndroidRuntime(2270):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
06-20 15:15:40.835: E/AndroidRuntime(2270):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
06-20 15:15:40.835: E/AndroidRuntime(2270):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-20 15:15:40.835: E/AndroidRuntime(2270):  at android.os.Looper.loop(Looper.java:137) 
06-20 15:15:40.835: E/AndroidRuntime(2270):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
06-20 15:15:40.835: E/AndroidRuntime(2270):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-20 15:15:40.835: E/AndroidRuntime(2270):  at java.lang.reflect.Method.invoke(Method.java:511) 
06-20 15:15:40.835: E/AndroidRuntime(2270):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
06-20 15:15:40.835: E/AndroidRuntime(2270):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
06-20 15:15:40.835: E/AndroidRuntime(2270):  at dalvik.system.NativeStart.main(Native Method) 
06-20 15:15:40.835: E/AndroidRuntime(2270): Caused by: java.lang.NullPointerException 
06-20 15:15:40.835: E/AndroidRuntime(2270):  at com.bentseytlin.maps.MainActivity.onCreate(MainActivity.java:84) 
06-20 15:15:40.835: E/AndroidRuntime(2270):  at android.app.Activity.performCreate(Activity.java:5104) 
06-20 15:15:40.835: E/AndroidRuntime(2270):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
06-20 15:15:40.835: E/AndroidRuntime(2270):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
06-20 15:15:40.835: E/AndroidRuntime(2270):  ... 11 more 

更新: 我不知道为什么,当log.i消息跨预期未来则返回null我XMLFILE功能。谢谢您的帮助!

回答

2

这logcat的消息:

06-20 15:15:40.827:E/A(2270):XMLFILE返回空字符串

表明您XMLFILE()函数返回null,并导致后续的空指针异常。

可能的事实是,您的LOGGING实体,并且它是一个流,意味着您不能再次阅读它。删除LOGGING语句,你的代码可能会工作。有关HttpEntity和可重复流的讨论,请参阅http://developer.android.com/reference/org/apache/http/HttpEntity.html#isRepeatable()

// This should work... 
String strEntity = EntityUtils.toString(resEntity); // read the Entity once! 
Log.i("RESPONSE", strEntity); 
return (strEntity); 
+0

是的,但我不明白为什么我的函数返回null。返回的响应显然不是null(基于log.i消息在LogCat中按预期发生的事实),但在下一行它由try-catch由于某种原因而被捕获 – benzabill

+0

谢谢,这似乎做诡计! 我会upvote,但我还没有15代表 – benzabill

+0

@benzabill好吧,从我的一些点,你的15总。为一个好的“初学者”问题+1。这里有很多问题甚至不包括基本信息。我也为你提名CSmith。要快速找到问题,请在函数的第一行放置一个断点并逐步完成。如果你不知道这意味着什么,请阅读一个调试Android教程。你会惊讶! – Simon