NumberFormatException:空

时间:2019-05-15 15:05:40

标签: java android sqlite

当我尝试向应用程序中添加分数/点时,我收到此错误:NumberFormatException: null

我为此创建了单独的表,因为我需要多个表。 我不知道问题出在哪里,所以谢谢大家。

  if(count==4) {

          my_db=new DBHelper(this);
          sqdb = my_db.getWritableDatabase();

          Cursor c_oldPoints= sqdb.query(DBHelper.TABLE_NAME2,null,DBHelper.NICKNAME+"=?",new String[]{Username},null,null,null);
          int col_Points=c_oldPoints.getColumnIndex(DBHelper.POINTS);
          c_oldPoints.moveToFirst();

          while (!c_oldPoints.isAfterLast())
             {
              OldPoints=c_oldPoints.getString(col_Points);
                            c_oldPoints.moveToNext();
             }
         sqdb.close();

         int OldP = Integer.parseInt(OldPoints);
         OldP+=countPoints;
         String SoldP = Integer.toString(OldP);
         my_db=new DBHelper(this);
         sqdb = my_db.getWritableDatabase();
         ContentValues cv = new ContentValues();
         cv.put(my_db.POINTS,SoldP);
         Cursor c = sqdb.query(DBHelper.TABLE_NAME2,null,DBHelper.NICKNAME+"=?",new String[]{Username},null,null,null);

         c.moveToFirst();
         while (!c.isAfterLast())
         {
            sqdb.update(DBHelper.TABLE_NAME2,cv, DBHelper.POINTS+"=?",new String[]{OldPoints});
            c.moveToNext();
         }
         sqdb.close();
         countPoints=0;

  }

这是日志猫:-

2019-05-15 18:18:14.101 8513-8513/com.example.user.soundsequ E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.user.soundsequ, PID: 8513
    java.lang.NumberFormatException: null
        at java.lang.Integer.parseInt(Integer.java:483)
        at java.lang.Integer.parseInt(Integer.java:556)
        at com.example.user.soundsequ.Game.onClick(Game.java:353)
        at android.view.View.performClick(View.java:5637)
        at android.view.View$PerformClick.run(View.java:22429)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

1 个答案:

答案 0 :(得分:0)

错误似乎在此行

int OldP = Integer.parseInt(OldPoints);

错误是说OldPoints的值不是可以转换为整数的字符串,例如如果它是A或null;

因此,从POINTS列中提取的值不是数字,或者Username的值与行中的NICKNAME列不匹配。在这种情况下,OldPoints将是循环之前设置的任何值。

由于数据本身不可用,您需要确定两种情况中的哪一种导致了问题。

我建议添加一些“登录”以确定哪个。

例如通过使用类似:-

      OldPoints = "my debugging value";
      Log.d("MYDEBUGGING","OldPoints, before doing anything is " + OldPoints);
      Cursor c_oldPoints= sqdb.query(DBHelper.TABLE_NAME2,null,DBHelper.NICKNAME+"=?",new String[]{Username},null,null,null);
      int col_Points=c_oldPoints.getColumnIndex(DBHelper.POINTS);
      c_oldPoints.moveToFirst();

      while (!c_oldPoints.isAfterLast())
         {

          OldPoints=c_oldPoints.getString(col_Points);
                        c_oldPoints.moveToNext();
          Log.d("MYDEBUGGING","Extracted the value " + OldPoints + " from position + String.valueOf(c_oldPoints.getPosition());
         }
     sqdb.close();

     Log.d("MYDEBUGGING","Trying to convert the value " + OldPoints + " to an integer");
     int OldP = Integer.parseInt(OldPoints);

您也无法进行上述更改并添加一个断点(在最初指示的行上),然后使用“运行/调试”应用程序并检查变量(或在适当的位置使用多个断点)。您可能会发现这对于调试Debug your app很有用。

以下代码可防止出现异常,也可防止尝试更新不存在的用户:-

    if (count == 4) {
        SQLiteDatabase sqdb = my_db.getWritableDatabase();

        Cursor c_oldPoints= sqdb.query(
                DBHelper.TABLE_NAME2,null,
                DBHelper.NICKNAME+"=?",
                new String[]{Username},
                null,null,null
        );
        int col_Points=c_oldPoints.getColumnIndex(DBHelper.POINTS);
        if (c_oldPoints.moveToFirst()) {
            Oldpoints = c_oldPoints.getString(col_Points);
            //Oldpoints = "oops";
            int OldP = 0;
            boolean can_convert_to_int = true;
            try {
                OldP = Integer.parseInt(Oldpoints) + countPoints;
                can_convert_to_int = true;
            } catch (NumberFormatException e) {
                e.printStackTrace(); //TODO not necessary probably remove. just for checking the log 
            }

            if (can_convert_to_int) {
                ContentValues cv = new ContentValues();
                cv.put(DBHelper.POINTS,OldP);
                sqdb.update(DBHelper.TABLE_NAME2,cv, DBHelper.NICKNAME + "=?", new String[]{Username});
            }
        } else {
            Log.d("NICKNAMENOTFOUND","No row was found when attemtping to get the old score for User " + Username);
        }
    }

但是

我建议您向DBHelper类添加几个方法,这些方法是:-

public int increasePoints(String user, int points_to_add) {
    SQLiteDatabase db = this.getWritableDatabase();
    SQLiteStatement sql = db.compileStatement(
            "UPDATE " + TABLE_NAME2 +
                    " SET " + POINTS + "=" + POINTS + " +?  " +
                    "WHERE "+ NICKNAME + "=?"
    );
    sql.bindLong(1,points_to_add);
    sql.bindString(2,user);
    return sql.executeUpdateDelete();
}

public int getPoints(String user) {
    SQLiteDatabase db = this.getWritableDatabase();
    int rv = -1;
    String whereclause = NICKNAME + "=?";
    String[] whereargs = new String[]{user};
    Cursor csr = db.query(TABLE_NAME2,new String[]{POINTS},whereclause,whereargs,null,null,null);
    if (csr.moveToFirst()) {
        rv = csr.getInt(csr.getColumnIndex(POINTS));
    }
    csr.close();
    return rv;
}

第一种方法 increasePoints 通过UPDATE sql语句执行对点的更改,并且不需要将提取为字符串的点转换为整数。它返回已更新的行数(如果NICKNAME列始终是唯一值,则返回1;如果未更新,则返回0)。

第二种方法 getPoints 就是说的,它获取给定用户的分数,如果该用户不存在,它将返回-1。

您的代码可能是:-

    if (count == 4) {
        boolean updated = false; //TODO remove when happy
        int old_points = my_db.getPoints(Username); //TODO remove when happy
        if (my_db.increasePoints(Username,countPoints) > 0) {
            updated = true;
        }
        int new_points = my_db.getPoints(Username); //TODO remove when happy

        //TODO remove following code when happy
        String result = "The result of the attempt to update the points for user " + Username;
        if (updated) {
            result = result + " was successful. ";
        } else {
            result = result + " was unsuccessful.";
        }
        Log.d("POINTSINCREASE",result +
                " Points were " + String.valueOf(old_points) + " points are now " + String.valueOf(new_points));
    }

注意,其中//TODO remove when happy被编码,这些行仅用于测试,因此上面的内容可能是:-

    if (count == 4) {
        my_db.increasePoints(Username,countPoints);
    }