这可能看起来像一个重复的问题,但我尝试了以下所有链接,但无法得到正确的答案。
但我不明白哪里出了问题。这是我的代码
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
方法采用对象类型参数,所以这就是为什么我传递了一个给出异常的字符串对象
线程“main”中的异常 java.lang.IllegalArgumentException:无法 将给定对象格式化为数字。
但是当我给出 double 值作为参数时,程序运行良好。但是,如果该方法是用 Object
类型参数定义的,为什么我在传递 String
时出现异常,而在传递 double
-a-9945 时却没有出现异常?
原文由 Arun Sudhakaran 发布,翻译遵循 CC BY-SA 4.0 许可协议
—的
DecimalFormat
format()
方法被重载。在工作案例中,您正在调用:
在失败的情况下,您正在调用:
第一种方法采用非常具体的参数。它期望一个
double
。这不是第二个的情况,接受的类型非常广泛:
Object
因此在运行时执行对传递类型的检查。通过提供一个不是
double
而是String
的参数,调用的方法是第二个方法。Under the hood, this method relies on the
format(Object number, StringBuffer toAppendTo, FieldPosition pos)
method that expects to anumber
argument that is an instance of theNumber
class (Short
,Long
, …Double
):但是当你传递给它一个
String
实例时,情况并非如此。To solve the problem, either pass a
double
primitive as in the success case or convert yourString
into an instance ofNumber
such asDouble
与Double.valueOf(yourString)
。我建议第一种方式(传递
double
),因为它在已经使用double
原语的代码中更自然。第二个需要从
String
到Double
的额外转换操作。