【问题标题】:NullPointerException :Parsing XML, creating InputStream from ByteArrayInputStream(string.getBytes())NullPointerException : 解析 XML,从 ByteArrayInputStream(string.getBytes()) 创建 InputStream
【发布时间】:2013-06-20 19:23:32
【问题描述】:

新的 Android 编程。

空指针发生在这一行:

 String toBeConverted = XmlFile(myURL, "username@user.com",
                "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 消息按预期出现时,为什么我的 XmlFile 函数返回 null。感谢您的帮助!

【问题讨论】:

    标签: android nullpointerexception xmlpullparser bytearrayinputstream


    【解决方案1】:

    这个 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);
    

    【讨论】:

    • 是的,是的,但我不明白为什么我的函数返回 null。返回的响应显然不是空的(基于 log.i 消息在 LogCat 中按预期出现的事实),但在下一行它由于某种原因被 try-catch 捕获
    • 谢谢,这似乎可以解决问题!我会投票,但我还没有 15 个代表
    • @benzabill 好吧,我给你的 15 分加分。 +1 一个好的“初学者”问题。这里的很多问题甚至不包括基本信息。我还为你投票支持 CSmith。要快速找到问题,请在函数的第一行设置断点并单步执行。如果您不知道这意味着什么,请阅读调试 Android 教程。你会惊讶的!
    • 感谢@Simon,我已经阅读了足够多的关于 SO 的问题(在我寻求 android 编程启蒙的过程中),以确定需要大量信息!
    • 获得了足够多的代表,刚刚回来 +1 你,@Simon
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多