android - 为什么在 Android 中执行此 HttpGet 会引发 NullPointerException?

标签 android apache http

我创建了一个新的 Android 项目,其中添加的唯一代码是 onCreate() 方法中的代码(我还在 list 中添加了 INTERNET 权限):

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_http_get_test);
    HttpClient client = new DefaultHttpClient();
    HttpGet request = new HttpGet();
    try
    {
        System.out.println("making uri");
        URI uri = new URI("http://w3mentor.com/");
        request.setURI(uri);
        System.out.println("executing");
        client.execute(request); // This line throws the exception
        System.out.println("Done!");
    }
    catch(Exception e)
    {
        System.out.println(e.getMessage());
    }
}

在日志中,我看到 try block 打印的最后一件事是executing,之后抛出了 NullPointerException。

我的代码松散地基于 this example 的开头,但我看不出我所做的不同操作会导致 NullPointerException。

在调试器中运行时,我发现异常实际上是 NetworkOnMainThreadException,当我尝试 e.getMessage() 时,它显然会导致 NullPointerException。

打印出的错误消息是

07-12 02:58:33.997: E/AndroidRuntime(983): FATAL EXCEPTION: main
07-12 02:58:33.997: E/AndroidRuntime(983): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.whatever.http.test/com.whatever.http.test.HttpGetTest}: java.lang.NullPointerException
07-12 02:58:33.997: E/AndroidRuntime(983):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
07-12 02:58:33.997: E/AndroidRuntime(983):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
07-12 02:58:33.997: E/AndroidRuntime(983):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
07-12 02:58:33.997: E/AndroidRuntime(983):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
07-12 02:58:33.997: E/AndroidRuntime(983):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-12 02:58:33.997: E/AndroidRuntime(983):  at android.os.Looper.loop(Looper.java:137)
07-12 02:58:33.997: E/AndroidRuntime(983):  at android.app.ActivityThread.main(ActivityThread.java:4424)
07-12 02:58:33.997: E/AndroidRuntime(983):  at java.lang.reflect.Method.invokeNative(Native Method)
07-12 02:58:33.997: E/AndroidRuntime(983):  at java.lang.reflect.Method.invoke(Method.java:511)
07-12 02:58:33.997: E/AndroidRuntime(983):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-12 02:58:33.997: E/AndroidRuntime(983):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-12 02:58:33.997: E/AndroidRuntime(983):  at dalvik.system.NativeStart.main(Native Method)
07-12 02:58:33.997: E/AndroidRuntime(983): Caused by: java.lang.NullPointerException
07-12 02:58:33.997: E/AndroidRuntime(983):  at com.android.internal.os.LoggingPrintStream.println(LoggingPrintStream.java:298)
07-12 02:58:33.997: E/AndroidRuntime(983):  at com.whatever.http.test.HttpGetTest.onCreate(HttpGetTest.java:33)
07-12 02:58:33.997: E/AndroidRuntime(983):  at android.app.Activity.performCreate(Activity.java:4465)
07-12 02:58:33.997: E/AndroidRuntime(983):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
07-12 02:58:33.997: E/AndroidRuntime(983):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
07-12 02:58:33.997: E/AndroidRuntime(983):  ... 11 more

最佳答案

问题不是 NullPointerException,但如果您调试应用程序,您会发现异常是:NetworkOnMainThreadException

您很可能在较新的 SDK(Honeycomb 或更高版本)上运行应用程序,因此不鼓励这样做。

任何网络代码,都应该放在一个线程中。理想情况下,使用 AsyncTask 来实现这一点。查看此链接:http://www.techblogistech.com/2011/11/how-to-fix-the-android-networkonmainthreadexception/

希望这有帮助。

关于android - 为什么在 Android 中执行此 HttpGet 会引发 NullPointerException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11444456/

相关文章:

apache - 为什么浏览器不缓存我的静态内容?

php - 随机排序的多次搜索的性能

.net - IIS 503 "Service Unavailable"通过 HTTPS,HTTP 工作正常

ruby-on-rails - 将分块传输与内容处置一起使用

java - 用户如何通过点击 google maps android 添加标记?

javascript - 从 React Native Android 原生地执行 JavaScript 代码

android - LinearLayout 在预 hive 上有分隔线

android - 与 API25 不同的项目中的低速

apache - Angular CLI 路由 - 不适用于(Apache-)服务器

rest - 相当于电子邮件的 REST