2012-02-06 23 views
4

以下は単純なコードです。の場合はいつもjava.util.IllegalFormatConversionExceptionとなっています。String.format()のエラー

java.util.Random r = new java.util.Random(); 
int i = r.nextInt(2); 
String s = String.format(
    String.format("%s", i == 0 ? "%d" : "%f"), 
    i == 0 ? r.nextInt() : r.nextFloat()); 
System.out.println(s); 

スタックトレース:私が間違ってやっている場合

Exception in thread "main" java.util.IllegalFormatConversionException: d != java.lang.Float 
    at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4011) 
    at java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2725) 
    at java.util.Formatter$FormatSpecifier.print(Formatter.java:2677) 
    at java.util.Formatter.format(Formatter.java:2449) 
    at java.util.Formatter.format(Formatter.java:2383) 
    at java.lang.String.format(String.java:2781) 
    at hb.java.test.App.testCompiler(App.java:17) 
    at hb.java.test.App.main(App.java:10) 

誰かが説明していただけますか?ありがとうございました。

答えて

5

奇妙なものであること。 2番目の条件のために2番目の条件付き(i == 0?r.nextInt():r.nextFloat())が両方ともFloatにキャストされているようです。以前これを見たことはありません。

public static void main(String[] args) { 
     java.util.Random r = new java.util.Random(); 
     int i = r.nextInt(2); 
     String s; 
     if(i == 0){ 
      s = String.format("%d", r.nextInt()); 
     } 
     else{ 
      s = String.format("%f", r.nextFloat()); 
     } 
     System.out.println(s); 
    } 
+0

+1素晴らしいキャッチ!条件演算子(http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.25) – nybbler

+0

@ジョンの仕様に従って、実際にこれを正しく処理しています。削除されたコメントを申し訳ありません。私はあなたのものを最初に受け入れたのを覚えておいてください。そして、Bantharさんの:-) –

0

これはどう:

final String s; 
if (i == 0) 
{ 
    s = String.format("%d", r.nextInt()); 
} 
else 
{ 
    s = String.format("%f", r.nextFloat()); 
} 
+0

ありがとうアレクサンダー。しかし、私はコードが間違っている理由を理解する必要があります。私はそれを得ました:-) –

2

i == 0 ? r.nextInt() : r.nextFloat()は、float型を持っています

はここで働く何か。 ?:オペレーターはintfloatの両方を返すことはできません。

+0

ありがとうBanthar、私は2つの答えを受け入れることができませんでした。しかし、あなたの答えです。 –

0

String.Formatのは最初のパラメータは形式ですが、あなたの例では、あなたが何かをする必要があり

の代わりにオブジェクトとしてF初期%の最初のパラメータとしてS%Dまたは%を持っている上このように:

String s = String.format(i == 0 ? "%d" : "%f", i == 0 ? r.nextInt() : r.nextFloat()); 
+0

それでも、同じ例外が発生します。演算子 '?:'は1つの型(または 'int'、または' float')のみを返すことができるので、答えは:-) –