试图将图像用于listview java.lang.NullPointerException

时间:2018-04-17 11:38:45

标签: android json image listview

我试图用图片和文字制作一个列表视图。因此,会遇到阻止应用程序正常工作的错误。单击调试后,应用程序启动进程对话框,加载5-10分钟,然后重新启动。调试器提供了以下错误:

E/AndroidRuntime: FATAL EXCEPTION: main
  Process: com.example.kin.myapplication, PID: 21172
  java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
    at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
    at org.json.JSONTokener.nextValue(JSONTokener.java:94)
    at org.json.JSONObject.<init>(JSONObject.java:156)
    at org.json.JSONObject.<init>(JSONObject.java:173)
    at com.example.kin.myapplication.Getjson.<init>(Getjson.java:25)
    at com.example.kin.myapplication.MainActivity2$1GetURLs.onPostExecute(MainActivity2.java:70)
    at com.example.kin.myapplication.MainActivity2$1GetURLs.onPostExecute(MainActivity2.java:59)
    at android.os.AsyncTask.finish(AsyncTask.java:632)
    at android.os.AsyncTask.access$600(AsyncTask.java:177)
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5538)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

主要操作在MainActivity2

上执行
public class MainActivity2 extends AppCompatActivity {
    ListView listView;
    private static final String newurl = "http://192.168.0.6/RegistrationLogin/getandroidosnames.php";
    private String json;
    private JSONArray urls;
    public  Getjson getjsonobj;
    Customadapter customadapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        listView = (ListView) findViewById(R.id.lst);
        getURLs();
    }
    //Get FoodTYpe
    private void getImages() {
        class GetImages extends AsyncTask<Void, Void, Void> {
            ProgressDialog loading;
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(MainActivity2.this, "Loading Menu", "Please wait...", false, false);
            }
            @Override
            protected void onPostExecute(Void v) {
                super.onPostExecute(v);
                loading.dismiss();
                customadapter = new Customadapter(MainActivity2.this, getjsonobj.Android_Name ,getjsonobj.bitmaps );
                listView.setAdapter(customadapter);
            }
            @Override
            protected Void doInBackground(Void... voids) {
                try {
                    getjsonobj.getAllImages();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                return null;
            }
        }
        GetImages getImages = new GetImages();
        getImages.execute();
    }
    private void getURLs() {
        class GetURLs extends AsyncTask<String, Void, String> {
            ProgressDialog loading;
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(MainActivity2.this, "Loading...", "Please Wait...", true, true);
            }
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                getjsonobj = new Getjson(s);
                getImages();
            }
            @Override
            protected String doInBackground(String... strings) {
                BufferedReader bufferedReader = null;
                try {
                    URL url = new URL(strings[0]);
                    HttpURLConnection con = (HttpURLConnection) url.openConnection();
                    StringBuilder sb = new StringBuilder();
                    bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));
                    String json;
                    while ((json = bufferedReader.readLine()) != null) {
                        sb.append(json + "\n");
                    }
                    return sb.toString().trim();
                } catch (Exception e) {
                    return null;
                }
            }
        }
        GetURLs gu = new GetURLs();
        gu.execute(newurl);
    }
}

GetJsonActivity

public class Getjson {
    public static String[] Image_Url;
    public static Bitmap[] bitmaps;
    public static String[] Android_Name;
    public static final String JSON_ARRAY="result";
    public static final String IMAGEURL = "ImagePath";
    public static final String AndroidName = "AndroidNames";
    private String json;
    private JSONArray urls;
    public Getjson(String json){
        this.json = json;
        try {
            JSONObject jsonObject = new JSONObject(json);
            urls = jsonObject.getJSONArray(JSON_ARRAY);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    private Bitmap getImage(JSONObject jo){
        URL url = null;
        Bitmap image = null;
        try {
            url = new URL(jo.getString(IMAGEURL));
            image = BitmapFactory.decodeStream(url.openConnection().getInputStream());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return image;
    }
    public void getAllImages() throws JSONException {
        Android_Name = new String[urls.length()];
        Image_Url = new String[urls.length()];
        bitmaps = new Bitmap[urls.length()];
        for(int i=0;i<urls.length();i++)
        { Android_Name[i]= urls.getJSONObject(i).getString(AndroidName);
            Image_Url[i] = urls.getJSONObject(i).getString(IMAGEURL);
            JSONObject jsonObject = urls.getJSONObject(i);
            bitmaps[i]=getImage(jsonObject);
        }
    }

1 个答案:

答案 0 :(得分:0)

当你这样做时

JSONObject jsonObject = new JSONObject(json);

如果json为空,则会崩溃,并且由于您只是捕获JSONException,因此NullPointerException会导致应用崩溃。 在尝试使用它初始化对象之前,您需要检查JSON字符串是否为null

if(s==null){
    //handle empty json 
    return;
} else {
    getjsonobj = new Getjson(s);
    // the rest of your processing that depends on your JSON object
    // for example, calling getImages();
}

您可能还想要包含一些代码来正常处理缺乏连接...