java.lang.NumberFormatException:无效的int:“null”

方法getAllActivities()必须以数组列表格式从数据库返回所有活动但是我得到:java.lang.NumberFormatException:无效的int:“null”,at activity.setActivityType(Integer.parseInt(cursor.getString(1))); 我不知道出了什么问题

 import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteStatement; import com.yast.util.Constants; import com.yast.util.Utils; import java.util.ArrayList; import java.util.List; public class DatabaseHandler extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "YastDB.db"; // Activities table name private static final String TABLE_ACTIVITIES = "Activities"; // Activities Table Columns names private static final String KEY_ID = "id"; private static final String KEY_ACTIVITYTYPE = "ActivityType"; private static final String KEY_HARTRATE = "HartRate"; private static final String KEY_HARTBATNO = "HartBatNo"; private static final String KEY_DISTANCE = "Distance"; private static final String KEY_SPEED = "Speed"; private static final String KEY_STRIDES = "Strides"; private static final String KEY_STARTDATETIME = "StartDateTime"; private static final String KEY_ENDDATETIME = "EndDateTime"; public static final String KEY_CURRENTDATETIME = "CurrentDateTime"; private String[] PROJECTION = new String[]{ KEY_ID, KEY_ACTIVITYTYPE, KEY_HARTRATE,KEY_HARTBATNO, KEY_DISTANCE, KEY_SPEED,KEY_STRIDES,KEY_STARTDATETIME,KEY_ENDDATETIME ,KEY_CURRENTDATETIME}; public DatabaseHandler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } // Creating Tables @Override public void onCreate(SQLiteDatabase db) { String CREATE_Activitys_TABLE = "CREATE TABLE " + TABLE_ACTIVITIES + "(" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_ACTIVITYTYPE + " INTEGER,"+ KEY_HARTRATE + " INTEGER, "+ KEY_HARTBATNO + " INTEGER,"+ KEY_DISTANCE + " INTEGER," + KEY_SPEED + " INTEGER," + KEY_STRIDES + " INTEGER," + KEY_STARTDATETIME + " TEXT," + KEY_ENDDATETIME + " TEXT," + KEY_CURRENTDATETIME + " TEXT" + ")"; db.execSQL(CREATE_Activitys_TABLE); } // Upgrading database @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // Drop older table if existed db.execSQL("DROP TABLE IF EXISTS " + TABLE_ACTIVITIES); // Create tables again onCreate(db); } //CRUD operations (Create, Read, Update and Delete) // Adding new activity public void addActivity(ActivityEntity activity) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_ACTIVITYTYPE, activity.getActivityType()); // Activity type values.put(KEY_HARTRATE, activity.getHartRate()); values.put(KEY_HARTBATNO, activity.getHartBatNo()); values.put(KEY_DISTANCE, activity.getDistance()); values.put(KEY_SPEED, activity.getSpeed()); values.put(KEY_STRIDES, activity.getStrides()); values.put(KEY_STARTDATETIME,activity.getStartDateTime().toString()); values.put(KEY_ENDDATETIME, activity.getEndDateTime().toString()); values.put(KEY_CURRENTDATETIME, activity.getCurrentDateTime().toString()); // Inserting Row db.insert(TABLE_ACTIVITIES, null, values); db.close(); // Closing database connection } // Getting single Activity /* The following method getActivity() will read single contact row. It accepts id as parameter and will return the matched row from the database. */ public ActivityEntity getActivity(int id) { ActivityEntity activity = null; SQLiteDatabase db = this.getReadableDatabase(); String where = KEY_ID + "=?"; String[] selectionArg = new String[]{String.valueOf(id)}; Cursor cursor = db.query(TABLE_ACTIVITIES, PROJECTION, where, selectionArg, null, null, null, null); if (cursor != null) { cursor.moveToFirst(); activity = new ActivityEntity(Integer.parseInt(cursor.getString(0)), Integer.parseInt(cursor.getString(1)), Integer.parseInt(cursor.getString(2)), Integer.parseInt(cursor.getString(3)), Integer.parseInt(cursor.getString(4)), Integer.parseInt(cursor.getString(5)), Integer.parseInt(cursor.getString(6)), cursor.getString(7), cursor.getString(8), cursor.getString(9)); } return activity; } // Getting All Activities public ArrayList getAllActivitys() { ArrayList activitiesList = new ArrayList(); SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.query(TABLE_ACTIVITIES, PROJECTION, null, null, null, null, null, null); // looping through all rows and adding to list if (cursor.moveToFirst()) { do { ActivityEntity activity = new ActivityEntity(); activity.setID(Integer.parseInt(cursor.getString(0))); activity.setActivityType(Integer.parseInt(cursor.getString(1))); activity.setHartRate(Integer.parseInt(cursor.getString(2))); activity.setHartBatNo(Integer.parseInt(cursor.getString(3))); activity.setDistance(Integer.parseInt(cursor.getString(4))); activity.setSpeed(Integer.parseInt(cursor.getString(5))); activity.setStrides(Integer.parseInt(cursor.getString(6))); activity.setStartDateTime(cursor.getString(7)); activity.setEndDateTime(cursor.getString(8)); activity.set_currentDateTime(cursor.getString(9)); // Adding activity to list activitiesList.add(activity); } while (cursor.moveToNext()); } return activitiesList; } public int getActivitiesCount() { String countQuery = "SELECT * FROM " + TABLE_ACTIVITIES; SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(countQuery, null); cursor.close(); // return count return cursor.getCount(); } // Updating single Activity public int updateActivity(ActivityEntity activity) { SQLiteDatabase db = this.getWritableDatabase(); String where = KEY_ID + "=?"; ContentValues values = new ContentValues(); values.put(PROJECTION[1], activity.getActivityType()); values.put(PROJECTION[2], activity.getHartRate()); values.put(PROJECTION[3], activity.getHartBatNo()); values.put(PROJECTION[4], activity.getDistance()); values.put(PROJECTION[5], activity.getSpeed()); values.put(PROJECTION[6], activity.getStrides()); values.put(PROJECTION[7], activity.getStartDateTime().toString()); values.put(PROJECTION[8], activity.getEndDateTime().toString()); values.put(PROJECTION[9], activity.getCurrentDateTime().toString()); // updating row return db.update(TABLE_ACTIVITIES, values, where, new String[] { String.valueOf(activity.getID()) }); } public void deleteActivity(ActivityEntity activity) { String where = KEY_ID + "=?"; SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABLE_ACTIVITIES, where, new String[] { String.valueOf(activity.getID()) }); db.close(); } public void bulkInsert(ArrayList arrayOfActivities) { SQLiteDatabase db = this.getWritableDatabase(); String sql = "INSERT INTO "+ TABLE_ACTIVITIES +" VALUES (?,?,?,?,?,?,?,?,?,?);"; SQLiteStatement statement = db.compileStatement(sql); db.beginTransaction(); for (ActivityEntity a : arrayOfActivities ) { statement.clearBindings(); statement.bindLong(1, (long) a.getID()); statement.bindLong(2, (long) a.getActivityType()); statement.bindLong(3, (long) a.getHartRate()); statement.bindLong(4, (long) a.getHartBatNo()); statement.bindLong(5, (long) a.getDistance()); statement.bindLong(6, (long) a.getSpeed()); statement.bindLong(7, (long) a.getStrides()); statement.bindString(8, a.getStartDateTime()); statement.bindString(9, a.getEndDateTime()); statement.bindString(10,a.getCurrentDateTime()); statement.clearBindings(); statement.execute(); } db.setTransactionSuccessful(); db.endTransaction(); } } 

ActivityEntity.java calss:

 import com.yast.util.Constants; import com.yast.util.Utils; import java.util.Date; public class ActivityEntity { int id; int activityType; int hartRate; int hartBatNo; int distance; int speed; int strides; String startDateTime; String endDateTime; String currentDateTime; public ActivityEntity(){ } // constructor public ActivityEntity(int Id, int activityType, int hartRate, int _hartBatNo, int distance, int speed, int strides, String startDateTime, String endDateTime, String currentDateTime){ this.id = Id; this.activityType = activityType; this.hartRate = hartRate; this.hartBatNo = _hartBatNo; this.distance = distance; this.speed = speed; this.strides = strides; this.startDateTime = startDateTime; this.endDateTime = endDateTime; this.currentDateTime = currentDateTime; } public void setID(int id){ this.id = id; } public int getID(){ return this.id; } public void setActivityType(int activityType){ this.activityType = activityType; } public int getActivityType(){ return this.activityType; } public void setHartRate(int hartRate){ this.hartRate = hartRate; } public int getHartRate(){ return this.hartRate; } public void setHartBatNo(int hartBatNo){ this.hartBatNo = hartBatNo; } public int getHartBatNo(){ return this.hartBatNo; } public void setDistance(int distance){ this.distance = distance; } public int getDistance(){ return this.distance; } public void setSpeed(int speed){ this.speed = speed; } public int getSpeed(){ return this.speed; } public void setStrides(int strides){ this.strides = strides; } public int getStrides(){ return this.strides; } public void setStartDateTime(String startDateTime){ this.startDateTime = startDateTime; } public String getStartDateTime(){ return this.startDateTime; } public void setEndDateTime(String endDateTime){ this.endDateTime = endDateTime; } public String getEndDateTime(){ return this.endDateTime; } public void set_currentDateTime(String currentDateTime){ this.currentDateTime = currentDateTime; } public String getCurrentDateTime(){ return this.currentDateTime; } @Override public String toString() { return "ActivityEntity{" + "id=" + id + ", activityType=" + activityType + ", hartRate=" + hartRate + ", hartBatNo=" + hartBatNo + ", distance=" + distance + ", speed=" + speed + ", strides=" + strides + ", startDateTime='" + startDateTime + '\'' + ", endDateTime='" + endDateTime + '\'' + ", currentDateTime='" + currentDateTime + '\'' + '}'; } } 

在你的代码中,如果cursor.getString(int num)返回null ,那么Integer.parseInt(String str)将抛出NumberFormatException

要避免这种情况,您应该检查cursor.getString(int num)返回的内容。

或者,您可以使用try-catch并在catch打印相应的消息,如果您将获得NumberFormatException

您应该检查您的cursor值是否为null

 if(cursor.isNull(column)) { //Value is null }else{ return cursor.getString(column); } 

在将值转换为Integer之前,必须检查是否为整数 。 如果它不是整数,则将其替换为默认整数。

 activity.setActivityType(Integer.parseInt(nulltoIntegerDefalt(cursor.getString(1)))); activity.setActivityType(Integer.parseInt(nulltoIntegerDefalt(cursor.getString(1)))); activity.setHartRate(Integer.parseInt(nulltoIntegerDefalt(cursor.getString(2)))); activity.setHartBatNo(Integer.parseInt(nulltoIntegerDefalt(cursor.getString(3)))); activity.setDistance(Integer.parseInt(nulltoIntegerDefalt(cursor.getString(4)))); activity.setSpeed(Integer.parseInt(nulltoIntegerDefalt(cursor.getString(5)))); activity.setStrides(Integer.parseInt(nulltoIntegerDefalt(cursor.getString(6)))); String nulltoIntegerDefalt(String value){ if(!isIntValue(value)) value="0"; return value; } boolean isIntValue(String val) { try { val=val.replace(" ",""); Integer.parseInt(val); } catch (Exception e) {return false;} return true; } 

"null"不是有效的int。 首先检查null。

您需要更仔细地检查空值:

1) cursor本身可以为null

2) cursor.getString(1)可以为null

把它放在一起:

 if (cursor != null && cursor.getString(1) != null){ /*your parse will be safe here*/ } 

请注意,我正在利用if将从左到右进行评估并在结果已知后停止评估的事实。

作为优化,您可能希望存储cursor.getString(1)的结果,以防止您必须对此进行两次评估。 但首先要使代码运行。

Cursor cursor = db.query(TABLE_ACTIVITIES, PROJECTION, null, null, null, null, null, null);

您的SQL查询字符串(查询方法中的第一个空输入)为null。 您尚未提供查询。 我假设你想要从表中的所有列,所以也许填写查询,如:

String SQLSTATEMENT = "SELECT " + KEY_ID + "," + KEY_ACTIVITYTYPE + "," KEY_HARTRATE + "," KEY_HARTBATNO + "," KEY_DISTANCE + "," KEY_SPEED,KEY_STRIDES + "," KEY_STARTDATETIME + "," KEY_ENDDATETIM + "," KEY_CURRENTDATETIME;

Cursor cursor = db.query(TABLE_ACTIVITIES, PROJECTION, SQLSTATEMENT, null, null, null, null, null);

 activity.setActivityType(Integer.parseInt(cursor.getString(1))); 

在这个cursor.getString(1) null,这就是你得到指针exception的原因。 检查该String值。

问题现在应该解决了,所以我只是解决了这个例外

一种更简单的方法是改变if(){}else{}" by "try{}catch(Exception e){}

示例:

 try { //Avoid/Éviter (FATAL EXCEPTION: main java.lang.NumberFormatException: Invalid int: "") //exemple / Exemple d'action int userWeight = Integer.parseInteger(userData); Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("weight", userWeight); // control Toast/Toast de contrôle Toast.makeText(MainActivity.this, "OK", Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeText(MainActivity.this, "not OK", Toast.LENGTH_LONG).show(); } 

感谢@ user3091530的回答。 我使用了自己的ParsInt方法。 创建一个名为Math的类。

 public class Math { //Checking the value if null return zero public int ParsIntOrDefalt(String value){ return Integer.parseInt(NullIntegerDefalt(value)); } private String NullIntegerDefalt(String value) { if (!isIntValue(value)) value = "0"; return value; } private boolean isIntValue(String val){ try { val=val.replace(" ",""); Integer.parseInt(val); } catch (Exception e) {return false;} return true; } } 

因此,我们可以使用它而不是主要的Integer.parseInt()方法:

 Math math = new Math(); activity.setActivityType(math.ParsIntOrDefalt(cursor.getString(1)));