Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.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 API设计:解析半数字字符串的方法的NumberFormatException?_Java_Api_Api Design - Fatal编程技术网

Java API设计:解析半数字字符串的方法的NumberFormatException?

Java API设计:解析半数字字符串的方法的NumberFormatException?,java,api,api-design,Java,Api,Api Design,我正在创建一个库,其中包含一些解析字符串日期和时间的方法。当字符串参数不可解析时,我很难决定这些方法应该抛出什么异常。我正在考虑几种选择: 1java.lang.IllegalArgumentException-无效字符串显然是非法参数,但对我来说,IllegalArgumentException通常意味着编程错误,很少有人想对其执行显式的try catch。我认为字符串解析通常用于外部输入,更像是一种需要特殊处理的特殊情况。比如说,如果有一大块代码解析了用户输入并对其执行了其他操作,那么您可能

我正在创建一个库,其中包含一些解析字符串日期和时间的方法。当字符串参数不可解析时,我很难决定这些方法应该抛出什么异常。我正在考虑几种选择:

1
java.lang.IllegalArgumentException
-无效字符串显然是非法参数,但对我来说,
IllegalArgumentException
通常意味着编程错误,很少有人想对其执行显式的
try catch
。我认为字符串解析通常用于外部输入,更像是一种需要特殊处理的特殊情况。比如说,如果有一大块代码解析了用户输入并对其执行了其他操作,那么您可能希望将该代码包装在try-catch块中,以便处理用户输入包含无效字符串的情况。但是捕获
IllegalArgumentException
对于查明无效的用户输入并不是一件好事,因为很可能代码中有多个地方可以抛出它(不仅仅是用户输入解析)

2
java.lang.NumberFormatException
-它是由
Integer.parseInt(String)
java.lang
中的其他类似解析方法引发的。因此,大多数Java开发人员都知道,当您试图解析可能有效或可能无效的字符串(例如,用户输入)时,它是一个异常。但它的名字中有“数字”,所以我不确定它是否真的适合日期和时间之类的东西,它们在某种意义上是数字的,但在我心目中概念上是不同的。如果它被称为“FormatException”

3
java.text.ParseException
-实际上不是一个选项,因为它已选中。我想检查一下这个

4。自定义异常-这绕过了
IllegalArgumentException
NumberFormatException
的缺点,它还可以扩展
IllegalArgumentException
。但我不认为向库中添加异常是一个好主意,除非它们确实需要。引用乔希·布洛赫的话。(同样,在我的例子中,对于解析日期和时间的包来说,很难命名这样的异常:“DateFormatException”、“TimeFormatException”、“CalendaryFormatException”(如JSR 310)-当应用于解析日期、时间、日期时间等的方法时,我觉得没有一个方法是理想的。我认为在一个包中创建多个异常(如果它们都只是用于识别不可解析的字符串)是愚蠢的。)

那么你认为哪种选择最有意义呢

注意,我有很好的理由不想使用java.util.Date或Joda Time,或JSR 310,所以不需要提出这些建议。另外,我认为如果这个问题保持相当一般的话会很好,因为这一定是其他设计API的人一直在努力解决的问题。日期和时间也可以是IP地址、URL或任何其他需要解析的字符串格式的信息

其他库设置的先例

我发现了几个例子:

java.sql.Timestamp.valueOf(String)抛出IllegalArgumentException

java.util.Date.parse(String)抛出IllegalArgumentException
(已弃用的方法,并且未声明异常,但您可以在源代码中看到它)

java.util.UUID.fromString(String)抛出IllegalArgumentException

org.apache.axis.types.Time(字符串)抛出NumberFormatException
(也是ApacheAxis中的Day类)

org.apache.tools.ant.util.DeweyDecimal(字符串)抛出NumberFormatException

com.google.gdata.data.DateTime.parseDateTime(字符串)抛出NumberFormatException

java.lang.Package.isCompatibleWith(String versionString)抛出NumberFormatException
(在java 7中,这需要一个带点的字符串版本号,在某种意义上类似于日期或时间)


我确信有很多软件包使用自定义异常,因此我怀疑给出这些例子有多大意义。

对于这个问题,这是一个品味问题。在我看来,我不会抛出异常,而是反过来处理它。原因是,如果输入错误,用户无法在异常处理程序中执行任何操作。因此,通过检查返回代码可以轻松处理这些类型的错误。例外情况很严重,不会带来额外的价值

我会建议将其作为基类(继承自
IllegalArgumentException
),但不幸的是,唯一的构造函数是受包保护的,所以我可能会使用

  • IllegalArgumentException
    小型API(几种方法)
  • 您自己的类层次结构继承自
    IllegalArgumentException
    否则
在任何情况下,我都会使用
IllegalArgumentException
作为基类

在我以前的一个项目中,准则是只抛出从

  • IllegalStateException
  • IllegalArgumentException
  • UnsupportedOperationException

虽然这不是一个正式的教条,但我认为这是一个很好的实践。这三个都是简单的和自描述性的。

我会选择ParseException,因为DateFormat.parse抛出的就是这个。因此它具有您在2中提到的优势,程序员熟悉它。但是由于您希望取消选中,我想这不是一个选项。我如果强制选择未检查,我将选择4。

我目前倾向于使用
NumberFormatException
。我当时的想法很简单
illegargumentexception
,但我很清楚,当我编写一个类似以下的小代码时,这并不理想:

try {
    final Day day = Day.fromString(userInputString);
    someMethodThatCouldAlsoThrowIllegalArgumentException(day);
} catch (IllegalArgumentException e) {
    ui.showWarningMessage("Invalid date: " + userInputString);
}
假设你解析了一个有效的
,你会想对它做点什么