使用DecimalFormat格式化抛出异常 - "无法将给定对象格式化为数字"

Aru*_*ran 9 java overloading exception illegalargumentexception decimalformat

这可能看起来像一个重复的问题,但我尝试了以下所有链接,无法得到正确的答案.

无法将给定对象格式化为数字组合框

非法论证例外

但我没有弄错.这是我的代码

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);
Run Code Online (Sandbox Code Playgroud)

format方法采用Object类型参数,这就是我传递给出异常的String对象的原因

线程"main"中的异常java.lang.IllegalArgumentException:无法 将给定的Object格式化为数字.

但是当我将double值作为参数时,程序运行正常.但是如果方法是用Object类型参数定义的,为什么我在传递时传递一个异常并且在传递时String没有获得异常double

dav*_*xxx 14

所述format()的方法DecimalFormat过载.

在工作案例中,您正在调用:

 public final String format(double number)
Run Code Online (Sandbox Code Playgroud)

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

 public final String format (Object obj) 
Run Code Online (Sandbox Code Playgroud)

第一种方法需要一个非常具体的参数.它期望一个double.

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

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

引擎盖下,此方法依赖于format(Object number, StringBuffer toAppendTo, FieldPosition pos)一个期望的方法number的论点,即是实例Number类(Short,Long,... 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当你传递给它一个String实例时并非如此.

为了解决这个问题,必须通过一个double原始的,如成功案例或你转换String成的实例,NumberDoubleDouble.valueOf(yourString).
我建议第一种方式(传递一个double),因为在你的代码中已经使用了double原语更自然.
第二个需要从附加转换操作StringDouble.