Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当Json数组为空时,Android在循环中获取Json数据失败_Java_Android_Json_Service - Fatal编程技术网

Java 当Json数组为空时,Android在循环中获取Json数据失败

Java 当Json数组为空时,Android在循环中获取Json数据失败,java,android,json,service,Java,Android,Json,Service,我随后获取JSON数据并保存在SQLite中 所以在这里,我将每5分钟获得10到100条记录,因此我将相同的功能添加到一个服务中,该服务每5分钟重复一次 所以现在的问题是,它将获得一些记录的数据。。在一些记录(如15-20)之后,Its显示此错误java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“int java.lang.String.length()” 这每5分钟重复一次,例如,我至少5次得到30条记录,它显示了这个错误 由于这个原因,我失去了记录数据

我随后获取JSON数据并保存在SQLite中

所以在这里,我将每5分钟获得10到100条记录,因此我将相同的功能添加到一个服务中,该服务每5分钟重复一次

所以现在的问题是,它将获得一些记录的数据。。在一些记录(如15-20)之后,Its显示此错误
java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“int java.lang.String.length()”

这每5分钟重复一次,例如,我至少5次得到30条记录,它显示了这个错误

由于这个原因,我失去了记录数据。。由于这个原因,我无法从服务器上获得30条记录,这些记录都丢失了

如何避免这个错误

这是我的服务课

    public class ServMain2 extends Service {

    public static final String MyShredPrefs = "MyShredPrefs_data";

    Context mContext = this;

    SQLiteDatabase sqLiteDatabase;
    String HttpJSonURL;

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        HttpJSonURL = intent.getExtras().getString("mystrdata");

        return START_STICKY;
    }

    @Override
    public void onCreate() {

        SharedPreferences s = getSharedPreferences(MyShredPrefs, 0);
        HashMap<String, String> map= (HashMap<String, String>) s.getAll();

        //ti= Integer.parseInt(map.get("time_int"));
        ti=3000;

       try{
           SQLiteDataBaseBuild();
           SQLiteTableBuild();

           new StoreJSonDataInToSQLiteClass(ServMain2.this).execute();
       }
       catch(Exception e){
           Toast.makeText(getApplicationContext(), "Reconnecting to Server", Toast.LENGTH_LONG).show();
       }

    }

    private class StoreJSonDataInToSQLiteClass extends AsyncTask<Void, Void, Void> {    //line No :65

        public Context context;
        String FinalJSonResult;

        public StoreJSonDataInToSQLiteClass(Context context) {
            this.context = context;
        }

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

        }

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

            HttpServiceClass httpServiceClass = new HttpServiceClass(HttpJSonURL);

            try {
                httpServiceClass.ExecutePostRequest();                 //line No :87
                if (httpServiceClass.getResponseCode() == 200) {
                    FinalJSonResult = httpServiceClass.getResponse();
                    if (FinalJSonResult != null) {

                        try {
                            JSONObject JObject = new JSONObject(FinalJSonResult);
                            JSONArray response =JObject.getJSONArray("response");
                            for(int i = 0 ; i < response.length(); i++) {
                                JSONObject res = response.getJSONObject(i);
                                String usr_id=res.getString("usr_id");
                                String phn_no=res.getString("phn_no");
                                String usr_name=res.getString("usr_name");

                                String usr_status= "NEW";

                                String SQLiteDataBaseQueryHolder = "INSERT INTO "+ SQLiteHelper.TABLE_NAME+" (usr_id,phn_no,usr_name,usr_status) VALUES('"+usr_id+"','"+phn_no+"','"+usr_name+"','"+usr_status+"');";

                                sqLiteDatabase.execSQL(SQLiteDataBaseQueryHolder);

                            }
                        }
                        catch (JSONException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
                else {
                    Toast.makeText(context, httpServiceClass.getErrorMessage(), Toast.LENGTH_SHORT).show();
                }
            }
            catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void result)
        {
            sqLiteDatabase.close();
            //progressDialog.dismiss();
            Toast.makeText(ServMain2.this,"Load Done", Toast.LENGTH_LONG).show();
        }
    }

    public void SQLiteDataBaseBuild(){
        sqLiteDatabase = openOrCreateDatabase(SQLiteHelper.DATABASE_NAME, Context.MODE_PRIVATE, null);
    }

    public void SQLiteTableBuild(){

        sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS "+SQLiteHelper.TABLE_NAME+" ("+SQLiteHelper.T_USR_NO+" INTEGER PRIMARY KEY AUTOINCREMENT ,"+SQLiteHelper.T_USR_ID+" INTEGER(6),"+SQLiteHelper.T_PHN_NO+" VARCHAR2(15) , "+SQLiteHelper.T_USR_NAME+" TEXT, "+SQLiteHelper.T_USR_STATUS+" VARCHAR2(15) NOT NULL)");

    }

    public void DeletePreviousData(){
        sqLiteDatabase.execSQL("DELETE FROM "+SQLiteHelper.TABLE_NAME+"");
    }

}
因为有时它会显示null,有时它会加载URL 有时由于URL为空而导致错误

有人能给我推荐这种吗。。我需要像这样的网址,因为我得到的网址从另一个服务

更新2

在我的JSON中,数据服务器发送一段时间的空JSON数组

应该是

{ 
"response": [ 
{ 
"usr_id": "1", 
"phn_no": "1234567890", 
"usr_name": "Demo" 
}, 
{ 
"usr_id": "2", 
"phn_no": "1234567890", 
"usr_name": "Demo" 
}, 
{ 
"usr_id": "3", 
"phn_no": "1234567890", 
"usr_name": "Demo" 
} 
] 
}
但有时我会得到空的JSON数组,比如

{ 
"response": [] 
}
我添加了
if(response!=null&&response.length()>0){
来检查它是否为空..但仍然是同一个问题..即使我添加了

catch (NullPointerException x) { 
// TODO Auto-generated catch block 
x.printStackTrace(); 
}
但仍然没有解决..有人能建议我如何处理这种类型的空字符串吗..

请按原样使用此代码。 我认为问题在于您的响应变量为空,请尝试检查它,如:

 try {
        JSONObject JObject = new JSONObject(FinalJSonResult);
        JSONArray response =JObject.getJSONArray("response");
        try {
            if (response != null && response.length() > 0) {
                for (int i = 0; i < response.length(); i++) {
                    JSONObject res = response.getJSONObject(i);
                    String usr_id = res.getString("usr_id");
                    String phn_no = res.getString("phn_no");
                    String usr_name = res.getString("usr_name");

                    String usr_status = "NEW";

                    String SQLiteDataBaseQueryHolder = "INSERT INTO " + SQLiteHelper.TABLE_NAME + " (usr_id,phn_no,usr_name,usr_status) VALUES('" + usr_id + "','" + phn_no + "','" + usr_name + "','" + usr_status + "');";

                    sqLiteDatabase.execSQL(SQLiteDataBaseQueryHolder);
                }
            }
        }catch (NullPointerException x) {
                // TODO Auto-generated catch block
                x.printStackTrace();
            }
    }
    catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
试试看{
JSONObject JObject=新的JSONObject(最终JSONResult);
JSONArray response=JObject.getJSONArray(“response”);
试一试{
if(response!=null&&response.length()>0){
对于(int i=0;i

如果(response!=null&&response.length()>0),则使用此代码检查
if(response!=null&&response.length()>0)

感谢您的回复user@irshadsheikh..但是它在第5个循环中失败了,,同样的情况再次发生..因为我认为URL在某些时候没有加载..这个错误似乎是这样..但是…如果可能的话,建议我如何修复它..我如何添加了你的行但是相同的错误打印一个响应日志。length()我已经添加了一个日志行
System.out.print(“@@@@@@Working$$$$$$$$”)
。但是它与我以前的Logcat类似。我正在使用Url,而不是Url…我在
if(response!=null&&response.length()>0)中添加了这个
。但我还是遇到了同样的错误问题“int java.lang.String.length()”来自您的数组为空,您尝试获取其长度是的,现在我得到了,您可以建议我如何解决它,它与服务器端的问题…如果您知道更新您的答案,我将标记
catch (NullPointerException x) { 
// TODO Auto-generated catch block 
x.printStackTrace(); 
}
 try {
        JSONObject JObject = new JSONObject(FinalJSonResult);
        JSONArray response =JObject.getJSONArray("response");
        try {
            if (response != null && response.length() > 0) {
                for (int i = 0; i < response.length(); i++) {
                    JSONObject res = response.getJSONObject(i);
                    String usr_id = res.getString("usr_id");
                    String phn_no = res.getString("phn_no");
                    String usr_name = res.getString("usr_name");

                    String usr_status = "NEW";

                    String SQLiteDataBaseQueryHolder = "INSERT INTO " + SQLiteHelper.TABLE_NAME + " (usr_id,phn_no,usr_name,usr_status) VALUES('" + usr_id + "','" + phn_no + "','" + usr_name + "','" + usr_status + "');";

                    sqLiteDatabase.execSQL(SQLiteDataBaseQueryHolder);
                }
            }
        }catch (NullPointerException x) {
                // TODO Auto-generated catch block
                x.printStackTrace();
            }
    }
    catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }