当前位置: 首页 > 面试题库 >

使用DecimalFormat进行格式化会引发异常-“无法将给定对象格式化为数字”

骆嘉石
2023-03-14
问题内容

但是我没有错。这是我的代码

DecimalFormat twoDForm = new DecimalFormat("#.##");
double externalmark = 1.86;
double internalmark = 4.0;
System.out.println(String.valueOf((externalmark*3+internalmark*1)/4));
String val = String.valueOf((externalmark*3+internalmark*1)/4);
String wgpa1=twoDForm.format(val); // gives exception
String wgpa2=twoDForm.format((externalmark*3+internalmark*1)/4)); // works fine
System.out.println(wgpa1);

format方法采用Object类型参数,因此这就是为什么我传递了一个给出异常的String对象的原因

线程“主”中的异常java.lang.IllegalArgumentException:无法 将给定对象格式化为数字。

但是,当我给出double值作为参数时,程序运行良好。但是,如果使用Object类型实参定义该方法,为什么在传递a
String时却得到异常而在传递时却没有得到异常double


问题答案:

format()方法DecimalFormat超载。

在工作情况下,您正在调用:

 public final String format(double number)

在失败的情况下,您正在调用:

 public final String format (Object obj)

第一种方法有一个非常具体的参数。它期望一个double

与第二种情况不同,接受的类型非常广泛:Object在这种情况下,对传递的类型的检查在运行时执行。

通过提供一个不是a double而是a 的参数,String调用的方法是第二个方法。

引擎盖下,此方法依赖于format(Object number, StringBuffer toAppendTo, FieldPosition pos)一个期望的方法number的论点,即是实例Number类(ShortLong,… Double):

@Override
public final StringBuffer format(Object number,
                                 StringBuffer toAppendTo,
                                 FieldPosition pos) {
    if (number instanceof Long || 
        number instanceof Integer ||                   
        number instanceof Short || 
        number instanceof Byte ||                   
        number instanceof AtomicInteger ||
        number instanceof AtomicLong ||
        (number instanceof BigInteger && ((BigInteger)number).bitLength () < 64)) {

        return format(((Number)number).longValue(), toAppendTo, pos);
    } else if (number instanceof BigDecimal) {
        return format((BigDecimal)number, toAppendTo, pos);
    } else if (number instanceof BigInteger) {
        return format((BigInteger)number, toAppendTo, pos);
    } else if (number instanceof Number) {
        return format(((Number)number).doubleValue(), toAppendTo, pos);
    } else {
        throw new IllegalArgumentException("Cannot format given Object as a Number");
    }
}

但事实并非如此,因为您将String实例传递给它。

要解决该问题,可以double像成功案例中那样传递原语,也可以将您String转换为Number诸如Doublewith
的实例Double.valueOf(yourString)
我建议采用第一种方式(通过double),因为它在已经使用double原语的代码中更加自然。
第二个需要从String到的附加转换操作Double



 类似资料: