2016-09-06 46 views
0

StringUtilsクラスで日付をフォーマットするときにNullPointerExceptionが返されます。私がStringUtilsなしでそれを使用すると、うまく動作します。データバインディングでstaticメソッドと併用するとNullPointerExceptionが発生する

私はこれを持ってStringUtils

のインポート文を追加しました:私は、デバッガで確認すると

public static String getFormattedDate(String unformattedDate) { 
     // unformattedDate will be in format of yyyy-mm-dd 
     // Convert it to d mmm, yyyy 
     SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); 
     String date = null; 
     try { 
      Date d = df.parse(unformattedDate); // <<--------- Here 
      SimpleDateFormat dateFormat = new SimpleDateFormat("d MMM, yyyy"); 
      date = dateFormat.format(d.getTime()); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     return date; 
    } 

、:

<TextView 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:text="@{StringUtils.getFormattedDate(user.date)}" /> 

これは私に私StringUtils方法でエラーになりますunformattedDateは最初からnullです。正しいメソッドが呼び出されますが、渡される値はnullです。これはおかしい。

私はレイアウトファイルでこのようにそれを使用する場合:

<TextView 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:text="@{user.date}" /> 

それは私にエラーを与えていない、と日付が画面に表示されます!

私はプロジェクトをクリーニングして再実行しようとしました。しかし、成功はありません。

+0

ここで、「user」の値を設定しているときは? –

+0

firebaseデータベースを使用して非同期にフェッチされます。それが問題になっていますか? – kirtan403

答えて

1

データ・バインディングは、それ自体はnullセーフですが、これは、パラメータとして値を使用するために保持していません。 getFormattedDate()は変更する必要があるため、nullでも安全であることを確認してください。とにかくParseExceptionがある場合、既にnullを返しています。

public static String getFormattedDate(String unformattedDate) { 
    try { 
     SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); 
     Date d = df.parse(unformattedDate); 
     SimpleDateFormat dateFormat = new SimpleDateFormat("d MMM, yyyy"); 
     return dateFormat.format(d.getTime()); 
    } catch (Exception e) { 
     Log.w("StringUtils", "getFormattedDate", e); 
     return null; 
    } 
} 
+0

これは私が思うより好ましいです。ありがとう! – kirtan403

1

初めてuserを実行すると、Firebaseデータベースから取得するまで価値がないので、user.dateもnullになります。三元入れ

android:text="@{user.date==null ? `` : StringUtils.getFormattedDate(user.date)}" 
+0

これは動作するはずです。しかし、それはコンパイルに失敗します。 – kirtan403

+0

エラーは何ですか? –

+0

特定のエラーを出さないだけでなく、自動的に生成されたすべてのバインディングクラスが見つからないということは奇妙です。 'android:text =" @ {user.amount} "' amountの値が 'double'の場合、このタイプのエラーが発生しました。 'android:text =" @ {String.valueOf(user.amount)} "をコンパイルすると正常にコンパイルされます。これは、特定のエラーが表示されない場合です。私はAndroidスタジオ2.1.3はまだデータバインディングでエラーになると湖を考えると – kirtan403

関連する問題