Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:为什么';t NumberFormatException扩展ParseException?_Java_Exception_Exception Handling - Fatal编程技术网

Java:为什么';t NumberFormatException扩展ParseException?

Java:为什么';t NumberFormatException扩展ParseException?,java,exception,exception-handling,Java,Exception,Exception Handling,将字符串解析为整数或双精度时,错误的格式将抛出NumberFormatException,但在解析为Date(例如)时,将抛出ParseException 这两个异常之前没有根,这就引出了一个问题:为什么 我希望通过捕获一个ParseException来优雅地处理所有异常。数字格式异常并不总是一个解析异常 NumberFormat是所有数字格式的抽象基类。此类提供了格式化和解析数字的接口。NumberFormat还提供了确定哪些语言环境具有数字格式及其名称的方法 这里呢 抛出以指示应用程序已尝

将字符串解析为整数或双精度时,错误的格式将抛出
NumberFormatException
,但在解析为
Date
(例如)时,将抛出
ParseException

这两个异常之前没有根,这就引出了一个问题:为什么


我希望通过捕获一个
ParseException

来优雅地处理所有异常。数字格式异常并不总是一个解析异常

NumberFormat是所有数字格式的抽象基类。此类提供了格式化和解析数字的接口。NumberFormat还提供了确定哪些语言环境具有数字格式及其名称的方法

这里呢

抛出以指示应用程序已尝试将字符串转换为一种数字类型,但该字符串的格式不正确


我怀疑NumberFormatException和ParseException由于历史原因没有共享一个共同的祖先。在任何情况下,从Java 7开始,您都可以编写:

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

对于Java 6(或更早版本),如果您的错误处理代码相当大,我建议将其放入错误处理方法中,并从两个
catch
子句调用该方法。

如果您希望不复制代码,则只需捕获NumberFormatException并抛出ParseException:

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

    …handle all in here

}

我不一定认为有人有意识地决定不按照你的建议设计它;可能就是这样。请注意NumberFormat是RuntimeException,而ParseException不是。@Andythonas Cramer-这是一个重要的观点。NumberFormatException是否应该是一个未经检查的异常,这是一个非常有争议的问题。Gosling等人用Java编程语言写道:“未经检查的运行时异常通常表示反映程序逻辑错误的情况,并且在运行时无法合理地恢复。”很难看出解析用户输入生成的NumberFormatException是如何在程序逻辑中出错的。是的:java考试说ParseException是一个选中的异常(当将字符串转换为数字时),但我们知道Integer.parseInt会抛出NumberFormatException。我发现NumberFormatException不是一个选中的异常,这让我很困惑。“…字符串没有合适的格式”听起来像是一个解析问题。@TedHopp这不是一个解析问题。因此,在解析某些东西之前,必须对其进行格式化。这毫无意义。解析已经格式化的文本时会引发异常(只是格式化的方式看起来不像数字)。@TedHopp实际上完全有道理。如果我正在解析任意长度的字符串并尝试将其转换为整数,我将执行以下操作:读入字符串(解析是),验证它是数字(格式化而不是解析),导致格式异常。格式问题不是解析问题。当我提交一篇论文时,我的教授从没有说过“这篇论文有很多解析问题”来自谷歌:“格式”的定义:排列或放入格式。“分析”的定义:将(一个句子)分析成它的组成部分,并描述它们的句法角色。解析有时被分解为词汇扫描和解析(在应用语法规则的更狭义的意义上),但解析(在一般意义上)从不涉及格式。格式化是您在书写纸张时对其所做的操作。解析是教授在阅读论文时对论文所做的事情。