我试图用图片和文字制作一个列表视图。因此,会遇到阻止应用程序正常工作的错误。单击调试后,应用程序启动进程对话框,加载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);
}
}
答案 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();
}
您可能还想要包含一些代码来正常处理缺乏连接...