2012-07-12 51 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

相關問題