2012-06-22 16 views
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)); 

यहाँ संदर्भ है एक MySQL तालिका में कॉलम में कुल संख्या औसत। जब कोई पंक्तियां होती हैं, तो यह उसमें डेटा का औसत वापस भेज देगी और यह इसे एन्कोड करेगी, और जावा इसे JSON ऑब्जेक्ट के रूप में उठाएगा। लेकिन कभी कभी, वहाँ मामलों में जहां एक मेज 0 पंक्तियों हो सकता है, इसलिए मैं इस JSON वस्तु मिलती है:

{"AverageRating":null} 

मेरा ऐप तो दुर्घटनाओं और LogCat है जैसा कि ऊपर देखा।

String परवाह नहीं है कि यह एक नल JSON ऑब्जेक्ट उठाता है लेकिन जब मैं Float.valueOf(theString) करता हूं तो ऐप क्रैश हो जाता है।

एक और पक्ष ध्यान दें, मैं इस तरह से परीक्षण करने के लिए प्रयास किया है:

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

लेकिन यह कभी अशक्त के रूप में स्ट्रिंग को पढ़ने के लिए नहीं लगता है। क्या वास्तव में इस मामले में null नहीं है?

उत्तर

25

जाँच करने के लिए JsonObject की निम्न विधि का उपयोग करता है, तो कोई भी कुंजी के खिलाफ एक मूल्य अशक्त

public boolean isNull(java.lang.String key) 

है इस विधि किसी भी कुंजी के खिलाफ अशक्त जाँच करने के लिए प्रयोग किया जाता है या अगर कोई कुंजी के लिए कोई मूल्य नहीं है।

नीचे

उपयोग झलकी कहा जा रहा है

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

'विपुल.इस जीनियस (शाह)? +1: null' – capdragon

+0

@capdragon आपको मदद करने के लिए खुश है :) –

+0

आगे मूल्यांकन पर, मैं इस उत्तर को सही पर ले जा रहा हूं। – KickingLettuce

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

parseFloat() अगर यह null प्राप्त करता है एक अपवाद फेंक देते हैं। अशक्त इससे पहले कि आप यह मान पार्स के लिए

+2

1. गैर-असाधारण स्थितियों को संसाधित करने के लिए अपवादों का उपयोग न करें 2. बेस क्लास 'अपवाद' को न पकड़ें। –

+0

ठीक है, मैं 2 से सहमत हूं। लेकिन, मुझे समझ में नहीं आता 1. क्यों? – nullpotent

+0

यह एक डिजाइन मुद्दा है। अपवाद असाधारण स्थितियों के लिए हैं ... चीजें जिन्हें आप कोड के सामान्य संचालन के दौरान होने की उम्मीद नहीं करते हैं। यह सिर्फ एक दिशानिर्देश है, और आपको अक्सर खराब एपीआई डिज़ाइन द्वारा इसका उल्लंघन करने के लिए मजबूर किया जाता है। इस मामले में, जेएसओएन उत्पन्न करने वाली इकाई या तो एक संख्या जोड़नी चाहिए (स्ट्रिंग नहीं, नल ऑब्जेक्ट नहीं), या फ़ील्ड को वैकल्पिक होने पर फ़ील्ड को रिक्त छोड़ दें। –

0

जांच,

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 पकड़ने का सुझाव दिया है। यह केवल तभी सही है जब आप हमेशा क्षेत्र में वैध डबल मान प्राप्त करने की अपेक्षा करते हैं और इसे अन्यथा असाधारण मानते हैं। यदि आप जानते हैं/उम्मीद करते हैं कि क्षेत्र कुछ समय अनुपस्थित होगा, तो यह असाधारण स्थिति के रूप में योग्य नहीं है।

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

कि json मूल्य के रूप में चाबी की तरह जांच शून्य मान।

संबंधित मुद्दे