2012-06-22 34 views
7

Tôi nhận LogCat này:kiểm tra cho đối tượng JSON null trong Java/Android

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) 

Đây là mã:

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

Đây là bối cảnh:

Trong PHP, tôi trung bình tổng số trong một cột trong bảng MySQL. Khi có bất kỳ hàng nào, nó sẽ gửi lại trung bình dữ liệu trong đó và nó mã hóa nó, và Java chọn nó như một đối tượng JSON. Nhưng đôi khi, có những trường hợp một bảng có thể có 0 hàng, vì vậy tôi có được JSON Object này:

{"AverageRating":null} 

Ứng dụng của tôi sau đó bị treo và LogCat là như đã thấy ở trên.

String dường như không quan tâm nếu nó chọn một đối tượng JSON Null nhưng ứng dụng gặp sự cố khi tôi làm Float.valueOf(theString).

Một mặt lưu ý, tôi đã cố gắng để kiểm tra theo cách này:

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

Nhưng nó không bao giờ dường như đọc String như null. Có thực sự là không null trong trường hợp này?

Trả lời

25

Sử dụng các phương pháp sau đây của JsonObject để kiểm tra xem một giá trị so với một phím bất kỳ là null

public boolean isNull(java.lang.String key) 

Phương pháp này được sử dụng để kiểm tra Null chống lại bất kỳ phím nào hoặc nếu không có giá trị cho phím.

Sử dụng bên dưới đoạn mã

if (jsonObject.isNull("AverageRating")) { 
    Toast.makeText(this, "Cannot Convert!!", Toast.LENGTH_LONG).show(); 
    //float set to 0 
} else { 
    Float.valueOf(jsonObject.getString("AverageRating")); 
} 
+4

'Vipul.isGenius (Shah)? +1: null' – capdragon

+0

@capdragon Rất vui được giúp bạn :) –

+0

Khi đánh giá thêm, tôi sẽ chuyển câu trả lời này sang câu trả lời đúng. – KickingLettuce

4
String str = jObject.getString("AverageRating"); 
float number = 0.f; 
try 
{ 
    number = Float.parseFloat(str); 
} 
catch (NumberFormatException e) 
{ 
    number = 0; 
} 

parseFloat() sẽ ném một ngoại lệ nếu nhận được null.

+2

1. không sử dụng ngoại lệ để xử lý các điều kiện không đặc biệt 2. không nắm bắt lớp cơ sở 'Ngoại lệ '. –

+0

Được rồi, tôi đồng ý với 2. Nhưng, tôi không hiểu 1. Tại sao? – nullpotent

+0

đó là một vấn đề thiết kế. trường hợp ngoại lệ dành cho các điều kiện đặc biệt ... những điều bạn không mong đợi xảy ra trong quá trình hoạt động bình thường của mã. đây chỉ là một hướng dẫn, và bạn thường buộc phải vi phạm điều này bằng thiết kế API kém. trong trường hợp này, thực thể tạo JSON nên thêm một số (không phải là một chuỗi, không phải là một đối tượng null), hoặc để trống trường nếu trường là tùy chọn. –

0

check for null trước khi bạn phân tích giá trị,

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

đó đang được nói, nếu giá trị của AverageRating thực sự là một con số, sau đó các đối tượng được tạo ra JSON không nên thêm nó vào JSON như một chuỗi. nếu không có giá trị cho trường, trường sẽ không có. nếu có giá trị cho trường, nó phải là một số.

nếu điều đó là đúng, bạn có thể xử lý nó như thế này,

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

bài viết khác đã gợi ý đơn giản là bắt NumberFormatException. điều này chỉ đúng nếu bạn dự kiến ​​có một giá trị kép hợp lệ trong trường mọi lúc và xem xét nó ngoại lệ khác. nếu bạn biết/mong đợi rằng một số trường sẽ vắng mặt, nó không đủ điều kiện như một điều kiện đặc biệt.

0
if (json != null && json.getString(KEY_SUCCESS) != null){ 
    // PARSE RESULT 
}else{ 
    // SHOW NOTIFICIATION: URL/SERVER NOT REACHABLE 
} 

đó đang được nói séc giá trị null như chính là giá trị json.

Các vấn đề liên quan