7

我得到了这个 LogCat:

06-22 15:30:53.731: E/AndroidRuntime(2389): java.lang.NumberFormatException: Invalid float: "null"
06-22 15:30:53.731: E/AndroidRuntime(2389):     at java.lang.StringToReal.invalidReal(StringToReal.java:63)
06-22 15:30:53.731: E/AndroidRuntime(2389):     at java.lang.StringToReal.parseFloat(StringToReal.java:310)
06-22 15:30:53.731: E/AndroidRuntime(2389):     at java.lang.Float.parseFloat(Float.java:300)
06-22 15:30:53.731: E/AndroidRuntime(2389):     at java.lang.Float.valueOf(Float.java:337)

这是代码:

try
{
    jObject = new JSONObject(result);
    starAvg = jObject.getString("AverageRating"); 
}
ratingsBar = (RatingBar) findViewById(R.id.theRatingBar);
ratingsBar.setRating(Float.valueOf(starAvg));

这是上下文:

在 PHP 中,我在 MySQL 表的列中平均总数。当有 ANY 行时,它会发回其中数据的平均值并对其进行编码,Java 将其作为 JSON 对象拾取。但有时,在某些情况下,一个表可能有 0 行,所以我得到了这个 JSON 对象:

 {"AverageRating":null}

然后我的应用程序崩溃,LogCat如上所示。

String似乎并不关心它是否接收到 Null JSON 对象,但是当我这样做时应用程序崩溃Float.valueOf(theString)

另一个旁注,我试图以这种方式进行测试:

if String is Null, Float = 0 
if String is not null, Float.valueOF(String)

但它似乎从来没有将字符串读为空。null在这种情况下实际上不是吗?

4

4 回答 4

25

使用以下方法JsonObject检查任何键的值是否为空

public boolean isNull(java.lang.String key)

此方法用于针对任何键检查 Null 或该键是否没有值。

使用下面的片段

if (jsonObject.isNull("AverageRating")) {
    Toast.makeText(this, "Cannot Convert!!", Toast.LENGTH_LONG).show();
    //float set to 0
} else {
    Float.valueOf(jsonObject.getString("AverageRating"));
}
于 2012-06-22T23:18:53.220 回答
4
String str = jObject.getString("AverageRating");
float number = 0.f;
try
{
    number = Float.parseFloat(str);
}
catch (NumberFormatException e)
{
    number = 0;
}

parseFloat()如果收到 . 将抛出异常null

于 2012-06-22T23:03:30.730 回答
0

在解析值之前检查 null,

String s = jObject.getString("AverageRating");
if (s != null) {
  double rating = Double.parseDouble(s);
  // whatever
}

话虽如此,如果 的值AverageRating确实是一个数字,那么生成 JSON 的实体不应将其作为字符串添加到 JSON 中。如果该字段没有值,则该字段应该不存在。如果该字段有值,它应该是一个数字。

如果这是真的,你可以这样处理,

if (jObject.has("AverageRating")) {
  double rating = jObject.getDouble("AverageRating");
  // whatever
}

其他帖子建议简单地捕捉NumberFormatException. 仅当您希望始终在该字段中具有有效的 double 值并认为它异常时,这才是正确的。如果您知道/期望该字段有时会不存在,则它不符合例外条件。

于 2012-06-22T23:12:29.760 回答
0
if (json != null && json.getString(KEY_SUCCESS) != null){
    // PARSE RESULT 
}else{
    // SHOW NOTIFICIATION: URL/SERVER NOT REACHABLE
}

话虽如此,检查空值(如键)作为 json 值。

于 2015-08-28T10:02:18.593 回答