Ошибка с String.format () - PullRequest
       2

Ошибка с String.format ()

4 голосов
/ 06 февраля 2012

Ниже приведен простой код, я получаю 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)

Может кто-нибудь объяснить, если я делаю неправильно? Спасибо.

Ответы [ 4 ]

5 голосов
/ 06 февраля 2012

Это странно. Похоже, что второе условие (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);
    }
2 голосов
/ 06 февраля 2012

i == 0 ? r.nextInt() : r.nextFloat() имеет тип float. Оператор ?: не может вернуть оба значения int и float.

0 голосов
/ 06 февраля 2012

В String.format первый параметр - это формат, но в приведенном выше примере у вас есть начальный% s в качестве первого параметра, а затем% d или% f в качестве объекта, который нужно заменить на

.как то так:

String s = String.format(i == 0 ? "%d" : "%f", i == 0 ? r.nextInt() : r.nextFloat());
0 голосов
/ 06 февраля 2012

Как насчет этого:

final String s;
if ( i == 0 )
{
    s = String.format("%d", r.nextInt( ));
}
else
{
    s = String.format("%f", r.nextFloat( ));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...