Java 当Json数组为空时,Android在循环中获取Json数据失败
我随后获取JSON数据并保存在SQLite中 所以在这里,我将每5分钟获得10到100条记录,因此我将相同的功能添加到一个服务中,该服务每5分钟重复一次 所以现在的问题是,它将获得一些记录的数据。。在一些记录(如15-20)之后,Its显示此错误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条记录,它显示了这个错误 由于这个原因,我失去了记录数据
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();
}