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成的实例,Number如Double用Double.valueOf(yourString).
我建议第一种方式(传递一个double),因为在你的代码中已经使用了double原语更自然.
第二个需要从附加转换操作String到Double.