Android - Cursor在Invoked时返回nullpointerexception ..如何解决这个问题?

时间:2016-07-20 12:01:14

标签: java android android-studio nullpointerexception

我正在尝试从内容提供商处获取活动,然后更新我的父视图,但由于某种原因,此行

if (c.moveToFirst()== false)

每当我尝试运行应用程序时,都会抛出NullPointerException。虽然我在初始化

之前已向游标对象添加了断言
 Cursor c = cr.query(EarthquakeProvider.CONTENT_URI, null, null, null, null, null);
            assert c != null;

然而我的android调试器将其识别为Null值。这是完整的方法..

    @TargetApi(16)
    private void loadQuakesFromProvider() {
// Clear the existing earthquake array
        quakeArrayList.clear();
        ContentResolver cr = getContentResolver();
        // Return all the saved earthquakes
        Cursor c = cr.query(EarthquakeProvider.CONTENT_URI, null, null, null, null, null);
        assert c != null;
        if (c.moveToFirst()== false) {
            do {
                // Extract the quake details.
                Long datems = c.getLong(EarthquakeProvider.DATE_COLUMN);
                String details;
                details = c.getString(EarthquakeProvider.DETAILS_COLUMN);
                Float lat = c.getFloat(EarthquakeProvider.LATITUDE_COLUMN);
                Float lng = c.getFloat(EarthquakeProvider.LONGITUDE_COLUMN);
                Double mag = c.getDouble(EarthquakeProvider.MAGNITUDE_COLUMN);
                String link = c.getString(EarthquakeProvider.LINK_COLUMN);
                Location location = new Location("dummy");
                location.setLongitude(lng);
                location.setLatitude(lat);
                Date date = new Date(datems);
                Quake q = new Quake(date, details, location, mag, link);
                addQuakeToArray(q);
            } while (c.moveToNext());
        }
        c.close();
    }

此处还有问题的堆栈跟踪

07-20 17:46:23.526 20526-20526/com.quakes.user.mapquake E/ActivityThread: Failed to find provider info for com.paad.provider.earthquake
    07-20 17:46:23.526 20526-20526/com.quakes.user.mapquake E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.quakes.user.mapquake, PID: 20526
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.quakes.user.mapquake/com.quakes.user.mapquake.MainActivity}: java.lang.NullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2200)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2249)
    at android.app.ActivityThread.access$800(ActivityThread.java:141)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5113)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
    at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
    at com.quakes.user.mapquake.MainActivity.loadQuakesFromProvider(MainActivity.java:331)
    at com.quakes.user.mapquake.MainActivity.onCreate(MainActivity.java:105)
    at android.app.Activity.performCreate(Activity.java:5248)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2164)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2249) 
    at android.app.ActivityThread.access$800(ActivityThread.java:141) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5113) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609) 
    at dalvik.system.NativeStart.main(Native Method) 
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err: java.net.UnknownHostException: Unable to resolve host "earthquake.usgs.gov": No address associated with hostname
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at java.net.InetAddress.lookupHostByName(InetAddress.java:424)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at java.net.InetAddress.getAllByName(InetAddress.java:214)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:503)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at com.quakes.user.mapquake.MainActivity$retrieveEarthquakeData.doInBackground(MainActivity.java:211)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at com.quakes.user.mapquake.MainActivity$retrieveEarthquakeData.doInBackground(MainActivity.java:197)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:288)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at java.lang.Thread.run(Thread.java:841)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err: Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at libcore.io.Posix.getaddrinfo(Native Method)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:61)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:     at java.net.InetAddress.lookupHostByName(InetAddress.java:405)
    07-20 17:46:23.556 20526-20542/com.quakes.user.mapquake W/System.err:   ... 19 more

1 个答案:

答案 0 :(得分:0)

First, check that you have the Assert function correclt imported

public static void main(String[] args) {

        String regexp = "(?:a)";
        Task t = new Task(regexp); // error
        t.process();

    }


class Task {

    private String origin;

    public Task() {
    }

    public Task(String origin) {
        this.origin = origin;
    }

    public void setOrigin(String origin) {
        this.origin = origin;
    }

    public String getOrigin() {
        return origin;
    }

    int length = origin.length(); //NullPointerException
...

您可以始终使用import static junit.framework.Assert.*; ,具有相同的整体效率。

另请注意,您的if(c != null){...} else {Log.e("src","msg")}会导致:

  

java.net.UnknownHostException:无法解析主机“earthquake.usgs.gov”:没有与主机名关联的地址

请改用完整的网址。