2011-12-06 105 views
1

将字符串解析为整数或双精度时,错误格式将抛出NumberFormatException,但解析为Date(例如)时将抛出ParseExceptionJava:为什么NumberFormatException不会扩展ParseException?

这两个没有根之前Exception,这引发了一个问题 - 为什么?

我想通过捕捉一个ParseException

+0

我不一定认为有意识的决定不按照你的建议来设计它;它可能就是这样。 –

+4

请注意,NumberFormat是RuntimeException,而ParseException不是。 –

+0

@ AndyThomas-Cramer - 这是一个重要的观点。 NumberFormatException是否应该是一个未经检查的异常是非常值得商榷的。 Gosling在Java编程语言_中编写代码:“未检查的运行时异常表示一般情况下反映程序逻辑中的错误,并且在运行时无法合理恢复的条件。”很难看出解析用户输入产生的NumberFormatException在程序逻辑中是如何出错的。 –

回答

2

数字格式例外很好地处理我的所有异常并不总是解析异常。

NumberFormat

“NumberFormat是所有数字格式的抽象基类,这个类提供了接口,用于格式化和分析数字。NumberFormat中还提供了确定的方法哪些语言环境,数字格式,以及他们的名字是。 “

这里NumberFormatException

” 抛出,IND应用程序试图将字符串转换为其中一种数字类型,但该字符串没有适当的格式。 “

+1

“...字符串没有适当的格式”听起来像是一个解析问题。 –

+0

@TedHopp这不是一个解析问题。因此,在解析某些东西之前,必须对其进行格式化。 – Woot4Moo

+0

这没有任何意义。解析_already_格式化的文本(只是格式不像数字)时抛出异常。 –

2

我怀疑NumberFormatException的和ParseException的不共享一个共同的祖先由于历史原因,在任何情况下,如Java 7,你可以写:

try { 
    . . . 
} catch (ParseException|NumberFormatException ex) { 
    // elegant handling goes here 
} 

对于Java 6(或更早版本),如果你的错误处理代码是相当大的,我建议把它放在一个错误处理方法,并从两个catch子句中调用方法

0

如果你正在寻找不重复的代码,然后只抓住NumberFormatException并抛出一个ParseException:

try { 
    try { 
     …parsing 
    } catch (NumberFormatException x1) { 
     throw new ParseException("",0); 
    } 
} catch (ParseException x2) { 

    …handle all in here 

} 
相关问题