下面是简单的代码,我java.util.IllegalFormatConversionException
时只有i == 0
。
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)
有人可以解释一下我做错了吗?谢谢。
答案 0 :(得分:5)
这是一个奇怪的。看起来第二个条件(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);
}
答案 1 :(得分:2)
i == 0 ? r.nextInt() : r.nextFloat()
的类型为float。 ?:
运算符无法同时返回int
和float
。
答案 2 :(得分:0)
这个怎么样:
final String s;
if ( i == 0 )
{
s = String.format("%d", r.nextInt( ));
}
else
{
s = String.format("%f", r.nextFloat( ));
}
答案 3 :(得分:0)
在String.format中,第一个参数是格式,但在上面的示例中,您将初始%s作为第一个参数,然后将%d或%f作为要替换的对象
你需要做这样的事情:
String s = String.format(i == 0 ? "%d" : "%f", i == 0 ? r.nextInt() : r.nextFloat());