2012-07-12 53 views
2

我创建了一个新的Android项目中,我已经添加了唯一的代码是这样的代码在onCreate()方法(我还添加了INTERNET许可清单):为什么在Android中执行此HttpGet会引发NullPointerException?

@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()); 
    } 
} 

在日志中,我请注意0​​块打印的最后一件事是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 
+2

您不应该在UI线程上执行网络连接。阅读这篇文章的更多信息:http://www.androiddesignpatterns.com/2012/06/app-force-close-honeycomb-ics.html – 2012-07-12 03:46:02

回答

5

问题不是一个NullPointerException异常,但如果您调试应用程序,你会发现,例外情况是:NetworkOnMainThreadException

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

任何网络代码,你应该把一个线程。理想情况下,使用AsyncTask即可。检查此链接:http://www.techblogistech.com/2011/11/how-to-fix-the-android-networkonmainthreadexception/

希望这可以帮助。

+0

谢谢,这是很好知道。我仍然困惑,为什么我的异常消息是'java.lang.RuntimeException:无法启动活动ComponentInfo {...}:java.lang.NullPointerException'。你知道这可能是为什么吗? – 2012-07-12 03:24:23

+0

完整的堆栈跟踪是什么样的? – 2012-07-12 03:27:13

+2

如果你在catch块中放置一个断点,你会注意到它导致了'NetworkOnMainThreadException'。现在,如果您检查其他变量,则会发现Exception实例中的detailMessage元素为空。所以不幸的是,它被NullPointer异常包装,这是令人困惑的,我同意。 – Romin 2012-07-12 03:27:21

相关问题