2012-01-07 4 views
1

ウェブ上でデータをダウンロードすると、時にはうまく動作しないことがあります。 ランタイム:「」Gsonはnull intでデシリアライズできないようです。

ランタイムがint型であると私はそれにgson使用する場合、この問題が発生する可能性があります: そして、私の問題は、1 intである

01-07 21:22:57.602: E/AndroidRuntime(2726): Caused by: java.lang.NumberFormatException: Invalid int: "" 

と声明が、それならば、私はいくつかにしようとしました動作しません。

public int getRuntime() { 
    if(Integer.valueOf(runtime)==null){ 
     return 0; 
    }else{ 
     return runtime; 
    } 
} 

あるいは

public int getRuntime() { 
    if(Integer.valueOf(runtime).equals(null)){ 
     return 0; 
    }else{ 
     return runtime; 
    } 
} 

が、何も動作。

+1

例外が何であるか、またはそれらを処理する方法がわからないようです:http://docs.oracle.com/javase/tutorial/essential/exceptions/ ヒント:「ランタイム」は何でも、そうではありません'int'に変換できるもの。あなたが投稿したものから、それは空の 'String'のように見える –

+0

しかし、データが動作しているときにはそれは数字であり、文字列ではなく、奇妙なものです。 – Tsunaze

+2

@Tsunaze JSONは常に_文字列です。数値はテキストのみでエンコードされています。数字1234とよく似ています(私のコメントでは:))は数字ではなく数字に解析できる文字列です。 – Thomas

答えて

5

Integer.valueOf()は整数を表す文字列を必要とします。空の文字列で呼び出すと、lead to an exceptionになります。あなたは整数としてそれを解析する前に文字列をテストする必要があります。

int runtime; 
if ("".equals(string)) { 
    runtime = 0; 
} 
else { 
    runtime = Integer.parseInt(string); 
} 

か、あなたは常に文字列が有効な整数でない場合、そのランタイムが0である場合は、例外をキャッチ:

try { 
    runtime = Integer.parseInt(string); 
} 
catch (NumberFormatException e) { 
    runtime = 0; 
} 

今、gsonはあなたのために文字列を解析します。この文字列は常に整数ではないので、runtimeフィールドはint型ではなくString型であるべきです。上に示したように、あなた自身でそれを解析する必要があります。

gsonとandroidで何かしようとする前に、あなたはJava言語の基礎を学ぶべきです。あなたはJavaの型システムと例外が何であるかを理解していないようです。 Read http://docs.oracle.com/javase/tutorial/java/nutsandbolts/

1

runtimeを最初にチェックする必要があります。 if(runtime.isEmpty())またはより良い - apache commons lang-if(StringUtils.isBlank(runtime))を使用するか、スローされたNumberFormatExceptionをキャッチします。あなたが何であるかの例外、またはそれらを処理する方法を理解していないよう

2

に見えます:

http://docs.oracle.com/javase/tutorial/essential/exceptions

public int getRuntime() { 

    int i = 0; 

    try { 
     i = Integer.valueOf(runtime); 
    } catch (NumberFormatException e) { 
     System.out.println("runtime wasn't an int, returning 0"); 
    } 

    return i; 

} 

ヒント:ランタイムが何であれ、それはint型に変換できるものではありません。投稿した内容から、空の文字列のように見えます。

2

ランタイムを文字列として処理します。デシリアライズするクラスの文字列として宣言します。

次に、このようgsonを使用すると、NULL値を処理する正しく

Gson gson = new GsonBuilder().serializeNulls().create(); 

これは、シリアライズ時に値がnullの場合、通常はそれだけでシリアライズし、JSONには何も入れていないだろうにも動作します。

関連する問題