java - 如何处理 asynctask 中发生的 json 异常

标签 java android json

从结果集为空的数据库中获取值时遇到json异常

下面是我的代码一切都很好,唯一的问题是当从数据库中获取的值是空的时候我遇到了 json 异常。我将如何处理这个帮助我,请帮助我,我正在使用 asytask 帮助我,请问我该怎么办?怎么处理???

public class fifthscreen extends Activity {
String num = null;
String _response;
// TextView ingredient;
private RatingBar ratingBar;
// TextView ingredient;
long Menu_ID;
String dish_ID;
View row4;
int IOConnect = 0;
View row3;
final private static int DIALOG_LOGIN = 1;
String status;
private static Handler handler;

ExpandableHeightGridView listview;

CategoryListAdapter3 cla;
String DescriptionAPI;

public Dialog dialog2;
public static int feedbacktype;
public static int myInt;

TextView txt1, txt2, txt3;
TextView ingredient;
ImageView img1;

String SelectMenuAPI;
DataBase db;
String FeedbackAPI;
String FeedbackAPI2;
static ArrayList<Long> Category_ID = new ArrayList<Long>();
static ArrayList<String> Category_name = new ArrayList<String>();
static ArrayList<String> Category_image = new ArrayList<String>();


ArrayList<Ingredient> ingredientList = new ArrayList<Ingredient>();

public static String allergen2;
private AQuery androidAQuery;
String name;
public static String FeedbackDishId;
String description;
String mainimage;
String allergen;
String url1;
View viewLoad;
String nutrition;
 String ingredientName;
  String ingredientSub;
  String formattedAsString;
Button FeedbackYummiSlice, FeedbackThisdish, nothanks;
final Context context = this;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fifthscreen);
    img1 = (ImageView) findViewById(R.id.test_button_image);

    txt1 = (TextView) findViewById(R.id.menuname);
    txt3 = (TextView) findViewById(R.id.description);
    ImageView b = (ImageView) findViewById(R.id.button1);
    ingredient = (TextView) findViewById(R.id.ingredient);

    Intent iGet = getIntent();
    ImageView options = (ImageView) findViewById(R.id.options5);
    androidAQuery = new AQuery(this);

    db = new DataBase(getBaseContext());
    try {
        db.createDataBase();
    } catch (IOException e1) {

        e1.printStackTrace();
    }

    options.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent iMenuList = new Intent(fifthscreen.this,
                    LinkButtons.class);
            startActivity(iMenuList);
        }
    });

    dish_ID = iGet.getStringExtra("dish_ID");

    listview = (ExpandableHeightGridView) findViewById(R.id.listview2);
    listview.setExpanded(true);

    cla = new CategoryListAdapter3(fifthscreen.this);
    new TheTask().execute();
    ImageView btnback = (ImageView) findViewById(R.id.btnback);

    btnback.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });

    b.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            dialog2 = new Dialog(context);
            View vLoad = LayoutInflater.from(fifthscreen.this).inflate(
                    R.layout.timer, null);

            dialog2.setContentView(vLoad);

            FeedbackYummiSlice = (Button) dialog2
                    .findViewById(R.id.FeedbackYummiSlice);
            FeedbackThisdish = (Button) dialog2
                    .findViewById(R.id.FeedbackThisdish);
            nothanks = (Button) dialog2.findViewById(R.id.nothanks);




            dialog2.setTitle("FeedBack");

            TextView text = (TextView) dialog2.findViewById(R.id.text);
            text.setText(" I");

            dialog2.setCancelable(false);

            FeedbackYummiSlice.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {

                    showDialog(DIALOG_LOGIN);
                    feedbacktype = 1;
                    FeedbackDishId = "0";

                }
            });

            FeedbackThisdish.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    //
                    showDialog(DIALOG_LOGIN);
                    feedbacktype = 2;
                    FeedbackDishId = dish_ID;

                }
            });

            nothanks.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    //
                    dialog2.dismiss();
                }
            });

            dialog2.show();
        }
    });

 }



public class TheTask extends AsyncTask<Void, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

    }

    @Override
    protected String doInBackground(Void... arg0) {

        return _response;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

            displayData();


        txt1.setText(name);
        txt3.setText(description);
        androidAQuery.id(img1).image(mainimage, true, true);



        listview.setAdapter(cla);
        cla.notifyDataSetChanged() ;




    }
}

@Override
protected Dialog onCreateDialog(int id) {

    AlertDialog dialogDetails = null;

    switch (id) {
    case DIALOG_LOGIN:
        LayoutInflater inflater = LayoutInflater.from(this);
        View dialogview = inflater.inflate(R.layout.dialog_layout, null);

        AlertDialog.Builder dialogbuilder = new AlertDialog.Builder(this);
        dialogbuilder.setTitle("Feedback Form");

        dialogbuilder.setView(dialogview);
        dialogDetails = dialogbuilder.create();

        break;
    }

    return dialogDetails;
}

@Override
protected void onPrepareDialog(int id, Dialog dialog) {

    switch (id) {
    case DIALOG_LOGIN:
        final AlertDialog alertDialog = (AlertDialog) dialog;
        Button Submit = (Button) alertDialog.findViewById(R.id.Submitbtn);
        Button cancelbutton = (Button) alertDialog
                .findViewById(R.id.btn_cancel);
        final EditText Email = (EditText) alertDialog
                .findViewById(R.id.Email);
        final EditText Comments = (EditText) alertDialog
                .findViewById(R.id.Comments);

        ratingBar = (RatingBar) alertDialog.findViewById(R.id.ratingBar);





    }
}









private void displayData()  {

    name ="";
    description ="";
    nutrition ="";
    allergen ="";
    mainimage ="";
    ingredientName ="";
    ingredientSub ="";
    formattedAsString="";

    Cursor mCursor = db
            .selectQuery("SELECT * ");

    if (mCursor.moveToFirst()) {
        do {

            name = (mCursor.getString(mCursor.getColumnIndex("name")));
            description 
         =(mCursor.getString(mCursor.getColumnIndex("description")));
            nutrition=(mCursor.getString(mCursor.getColumnIndex("nutrition")));
            allergen=(mCursor.getString(mCursor.getColumnIndex("allergen")));
            mainimage=(mCursor.getString(mCursor.getColumnIndex("image")));
        } while (mCursor.moveToNext());
    }

    mCursor.close();






    Cursor mCursor2 =  db.selectQuery("SELECT ");


    if (mCursor2.moveToFirst()) {
        do {
            ingredientName = mCursor2.getString(mCursor2.getColumnIndex("name"));
            ingredientSub = mCursor2.getString(mCursor2.getColumnIndex("sub_ingredients"));

            // create an Ingredient object in your loop and fill its
            // values
            Ingredient ingredientItem = new Ingredient();
            ingredientItem.setName(ingredientName);
            ingredientItem.setSub(ingredientSub);

            // Add your ingredient to your ingredientList
            ingredientList.add(ingredientItem);

        } while (mCursor2.moveToNext());
    }

    // Now you got a list of ingredients.
     formattedAsString = getFormattedIngredientList(ingredientList);
     ingredient.setText(Html.fromHtml(formattedAsString));

    mCursor2.close();





    Category_ID.clear();
    Category_name.clear();
    Category_image.clear();

    try {
    JSONArray jArray = new JSONArray(allergen);
    //
    for (int i = 0; i < jArray.length(); i++) {
        JSONObject object = jArray.getJSONObject(i);


        Category_ID.add((long) i);
        Category_name.add(object.getString("name"));
        Category_image.add(object.getString("image"));

    }




    JSONObject json = new JSONObject(nutrition);

final TableLayout table = (TableLayout) findViewById(R.id.table2);

                for (int j = 0; j < json.length(); j++) {

                    String s = String.valueOf(j + 1);

row3 = getLayoutInflater().inflate(R.layout.rows, null);
((TextView) row3.findViewById(R.id.localTime)).
       setText(json.getJSONObject(s).getString("qty"));
((TextView) row3.findViewById(R.id.apprentTemp)).

      setText(json.getJSONObject(s).getString("name"));

                    table.addView(row3);

                }




    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }




}



private String getFormattedIngredientList(ArrayList<Ingredient> ingredientList) {

    String concatProduct = "";
    for (int i = 0; i < ingredientList.size(); i++) {
        Ingredient currentIngredient = ingredientList.get(i);
                    if(currentIngredient.getSub() == null) {
                       currentIngredient.setSub("");  
                    }
        if (i == 0) {
            if ((currentIngredient.getSub() == null || 
  currentIngredient.getSub().equals(""))) {
                concatProduct = " " + "<b>" + currentIngredient.getName() + "</b>" + ", " + 
   currentIngredient.getSub();
            } else {
                concatProduct = " " + "<b>" + currentIngredient.getName() + "</b>" + ": " + 
  currentIngredient.getSub();
            }

        } else {
            if ((currentIngredient.getSub() == null || 
        currentIngredient.getSub().equals(""))) {
                if (i == ingredientList.size() - 1) {
                    concatProduct += " " + "<b>" + currentIngredient.getName() + "</b>" + 
           ". " + currentIngredient.getSub();
                } else {
                    concatProduct += " " + "<b>" + currentIngredient.getName() + "</b>" + 

         ", " + currentIngredient.getSub();
                }
            } else {
                concatProduct += " " + "<b>" + currentIngredient.getName() + "</b>" + ": " + currentIngredient.getSub();
            }
        }
    }

    return concatProduct;
}

   }


      **Following is exception:**

                 FATAL EXCEPTION: main
    java.lang.NullPointerException
at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:112)
at org.json.JSONTokener.nextValue(JSONTokener.java:90)
at org.json.JSONArray.<init>(JSONArray.java:87)
at org.json.JSONArray.<init>(JSONArray.java:103)
at com.schoollunchapp.fifthscreen.displayData(fifthscreen.java:444)
at com.schoollunchapp.fifthscreen.access$0(fifthscreen.java:377)
at com.schoollunchapp.fifthscreen$TheTask.onPostExecute(fifthscreen.java:253)
at com.schoollunchapp.fifthscreen$TheTask.onPostExecute(fifthscreen.java:1)
at android.os.AsyncTask.finish(AsyncTask.java:417)
at android.os.AsyncTask.access$300(AsyncTask.java:127)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)

最佳答案

我认为这是由于 nullpointerexception.. 你需要显式处理空值

if(mCursor!=null){
if (mCursor.moveToFirst()) {
                do {
                    name = (mCursor.getString(mCursor.getColumnIndex("name")));
                    description =(mCursor.getString(mCursor.getColumnIndex("description")));
                    nutrition=(mCursor.getString(mCursor.getColumnIndex("nutrition")));
                    allergen=(mCursor.getString(mCursor.getColumnIndex("allergen")));
                    mainimage=(mCursor.getString(mCursor.getColumnIndex("image")));
                } while (mCursor.moveToNext());
            }

}

稍后还要检查

if(allergen!=null){
  JSONArray jArray = new JSONArray(allergen);
......
}

关于java - 如何处理 asynctask 中发生的 json 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19768607/

相关文章:

java - FlagSort - 分而治之 - 小麻烦

java - 无法解析方法 'fromJson(org.json.JSONObject, java.lang.Class<me.myrottentomatoes.Result[]>)'

android - PorterDuff.Mode.DST_IN 应该透明的地方变黑

ASP.NET MVC3 Ajax 错误响应与 HTTP 4XX

json - 使用 Go 解析 .Net JSON 日期

java - 在ubuntu中重新启动java应用程序

java - 如何将拥有的域名从 aws route 53 绑定(bind)到 jelastic URL

javascript - ASP.NET MVC 将字符串传递给 JSON.parse,并出现引号转义问题

java - 异常 : java. lang.IndexOutOfBoundsException : Index: 0, 大小:0

android - 使用 AchartEngine 的条形图