【发布时间】:2026-01-10 00:55:02
【问题描述】:
真是个愚蠢的问题。给定代码:
public static int sum(String a, String b) /* throws? WHAT? */ {
int x = Integer.parseInt(a); // throws NumberFormatException
int y = Integer.parseInt(b); // throws NumberFormatException
return x + y;
}
你能判断它是否是好的 Java 吗?我在说的是,NumberFormatException 是一个未经检查的异常。您不必将其指定为sum() 签名的一部分。此外,据我了解,未经检查的异常的想法只是表明程序的实现不正确,更重要的是,捕获未经检查的异常是一个坏主意,因为它就像 在运行时修复坏程序 .
有人请澄清一下:
- 我应该指定
NumberFormatException作为方法签名的一部分。 - 我应该定义自己的已检查异常 (
BadDataException),在方法内处理NumberFormatException并将其重新抛出为BadDataException。 - 我应该定义自己的检查异常 (
BadDataException),以某种方式验证两个字符串,就像正则表达式一样,如果不匹配,则抛出我的BadDataException。 - 你的想法?
更新:
想象一下,它不是一个开源框架,你应该出于某种原因使用它。您查看方法的签名并认为 - “好的,它永远不会抛出”。然后,有一天,你遇到了一个例外。正常吗?
更新 2:
有一些 cmets 说我的sum(String, String) 是一个糟糕的设计。我完全同意,但是对于那些认为如果我们有好的设计就不会出现原始问题的人,这里有一个额外的问题:
问题定义如下:您有一个数据源,其中数字存储为Strings。这个来源可能是 XML 文件、网页、带有 2 个编辑框的桌面窗口等等。
您的目标是实现采用这两个Strings 的逻辑,将它们转换为ints 并显示消息框说“总和是xxx”。
无论您使用什么方法来设计/实现它,您都将拥有这 2 点内部功能:
- 将
String转换为int的地方 - 添加 2 个
ints 的地方
我原来的帖子的主要问题是:
Integer.parseInt() 期望传递 正确 字符串。每当你传递一个错误的字符串,就意味着你的程序不正确(不是“你的用户是个白痴”)。你需要实现一段代码,一方面你有 Integer.parseInt() 和 MUST 语义,另一方面你需要在输入不正确的情况下正常 - 应该语义。
简单地说:如果我只有MUST 库,我该如何实现应该语义。
【问题讨论】:
-
这绝不是一个愚蠢的问题。其实这是一个很不错的!我不完全确定,我会选择哪个选项。
-
致您的更新:是的,根据快速失败的原则,这也不一定是坏事。
-
我同意马丁的观点。这是 Java 编程中最不了解的方面之一,需要一些最佳实践。这可以从缺乏关于该主题的页面中看出,除了 O'Reilly 说“这是应该这样做的”之外,很少有人说。
-
其实这是一个很好的问题。
-
好问题!还提出了一些很好的答案:D