Java API设计:用于解析半数字字符串的方法的NumberFormatException?
|
我正在制作一个包含一些解析字符串日期和时间的方法的库。我很难确定当字符串参数不可解析时那些方法应该抛出什么异常。我正在考虑几种选择:
1.
java.lang.IllegalArgumentException
-无效的字符串显然是非法的参数,但是,对我来说,IllegalArgumentException
通常意味着编程错误,并且很少想为一个显式的try catch
做。我认为字符串解析通常用于外部输入,更多的是特殊情况,值得特殊对待。例如,如果您有一大段代码来解析用户输入并对其进行了其他操作,则可能需要将该代码包装在try catch块中,以便处理用户输入包含无效字符串的情况。但是捕获ѭ1并不能很好地指出无效的用户输入,因为很可能在代码中可能抛出多个位置(而不仅仅是用户输入解析)。
2.java.lang.NumberFormatException
-Integer.parseInt(String)
和java.lang
中的其他类似解析方法抛出。因此,大多数Java开发人员都熟悉它,因为它是您尝试解析可能有效或无效的字符串(例如用户输入)时捕获的异常。但是它的名称中带有“ Number”,所以我不确定它是否确实适合日期和时间之类的东西,从某种意义上来说,它们是数字,但在我看来却是概念上的不同。如果仅将其称为\“ FormatException \” ...
3.java.text.ParseException
-并非真正的选项,因为已选中。我要对此取消检查。
4.一个自定义例外-绕过ѭ1和NumberFormatException
的缺点,它也可能扩展IllegalArgumentException
。但是我认为除非确实需要例外,否则将例外添加到库中不是一个好主意。引用乔什·布洛赫(Josh Bloch)的话:“如有疑问,请不要理会”。 (对于我来说,对于解析日期和时间的程序包,很难这样的异常命名:\“ DateFormatException \”,\“ TimeFormatException \”,\“ CalendricalFormatException \”(例如JSR 310)-当我将其应用于解析日期,时间,日期时间等的方法时,对我来说似乎没有一个理想的选择。而且我认为,如果它们仅用于标识无法解析的字符串,则在单个包中创建多个异常将是愚蠢的。)
那么您认为哪种选择最有意义?
注意:我有充分的理由不想使用java.util.Date或Joda Time或JSR 310,因此无需提出建议。另外,我认为将这个问题保持在一般范围内会很好,因为这肯定是其他设计API的人都在努力解决的问题。日期和时间也可以是IP地址,URL或具有需要解析的字符串格式的任何其他类型的信息。
其他图书馆设立的先例
我发现了一些例子:
java.sql.Timestamp.valueOf(String) throws IllegalArgumentException
java.util.Date.parse(String) throws IllegalArgumentException
(不建议使用的方法,没有声明异常,但是您可以在源代码中看到它)
java.util.UUID.fromString(String) throws IllegalArgumentException
org.apache.axis.types.Time(String) throws NumberFormatException
(也是Apache Axis中的Day类)
org.apache.tools.ant.util.DeweyDecimal(String) throws NumberFormatException
com.google.gdata.data.DateTime.parseDateTime(String) throws NumberFormatException
java.lang.Package.isCompatibleWith(String versionString) throws NumberFormatException
(在Java 7中,它采用带点的字符串版本号-在某种意义上类似于日期或时间)
我确定有很多使用自定义异常的程序包,因此我怀疑给出示例的意义是否很大。
没有找到相关结果
已邀请:
4 个回复
驮帽俺篮号
作为基类(它继承自
,但是不幸的是,唯一的构造方法是受程序包保护的,因此我可能会使用 a1ѭ 小API(几种方法) 您自己的继承自ѭ1Class的类层次结构。 无论如何,我都将ѭ1用作基类。 在我以前的项目之一中,指导方针是仅抛出从继承的RuntimeExceptions。
尽管这不是官方的教条,但我认为这是一种好习惯。所有这三个都是简单的自我描述。
攫怂绵十
郸身
鲁釜头
。我当时以为是普通的旧
,但是对我来说,当我编写如下代码时,这很不理想:
假设您解析了一个有效的
,则需要对其进行处理。如果传递给它们的方法接收到无效的参数(即编程错误而不是用户错误),则很可能会抛出“ 1”。在上例中的代码中,您需要注意不要将编程错误与无效的用户输入混为一谈,因此,为了安全起见,您需要在try /之前定义一个空变量(如null变量) catch块,然后检查是否为null。 将
换为
或自定义例外,问题就消失了。 看到JDK 1.7的
将
用于解析版本号的方法(像a35ѭ这样的半数字字符串)后,我认为对于解析日期和日期之类的方法,这也可能是明智的选择。次。
对于解析仅是半数字的字符串并不是十分理想,但是当您不想用不需要的自定义异常来弄乱API时,它也许是最佳选择。如果他们在ѭ6中执行此操作,那么按照定义,这可能使其成为Java的处理方式... 我希望它能流行:)