【问题标题】:Tried to use images into listview java.lang.NullPointerException试图将图像用于列表视图 java.lang.NullPointerException
【发布时间】:2018-04-17 11:38:44
【问题描述】:

我试图用图像和文本制作一个列表视图。因此面临阻止应用程序正常工作的错误。单击调试后,应用程序启动进程对话框,并加载 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);
        }
    }

【问题讨论】:

  • 是的.. 而且??有什么问题吗?
  • 我们不知道的类的构造函数中的问题... 在 com.example.kin.myapplication.Getjson.(Getjson.java:25)
  • private void getImages() { 为什么要发布该功能的代码?您无处调用该函数。
  • 该应用程序根本无法运行@greenapps
  • The system cannot resolve dots and words "my" and "is" 当然不是。你是在盲目使用吗?当然,您应该自己正确地编写 Toast() 代码!从未使用过 Toast()?

标签: android json image listview


【解决方案1】:

当你这样做时

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

您可能还想包含一些代码来优雅地处理缺乏连接性...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多