尝试使用无用的东西是一种好方法,只是为了查看此代码是否抛出了特定的异常? 抛出异常时我想做点什么,否则什么也没做。
try {
new BigDecimal("some string"); // This do nothing because the instance is ignored
} catch (NumberFormatException e) {
return false; // OK, the string wasn't a well-formed decimal
}
return true;
要测试的前提条件太多,构造函数BigDecimal()总是检查它们,所以这似乎是最简单的方法。
答案 0 :(得分:49)
一般来说,应该避免这种做法。但由于没有实用方法isValidBigDecimal(..)
,所以就是这样。
正如Peter Tillemans在评论中指出的那样,将此代码放在名为isValidBigDecimal(..)
的实用程序方法中。因此,您的代码将无法确定有效性的方式,您甚至可以稍后切换到另一种方法。
BorisPavlović建议选择使用第三方库(commons-lang)进行检查。还有一个有用的方法,我需要验证数字时使用它 - NumberUtils.isNumber(..)
答案 1 :(得分:30)
如果你不喜欢这样的方法,请尝试使用BigDecimalValidator
中的Apache Commons Validator。如果输入无效String
,则会返回null
。
答案 2 :(得分:6)
这样做没有错;毕竟,某种其他语言的支持者喜欢说“道歉比要求许可更容易”,也就是说,等待某些事情失败并处理它比避免完全失败更容易。在这种情况下,由于没有其他选择,绝对可以选择。
答案 3 :(得分:5)
性能可能不是很好,语法冗长,但代码非常精确,它的功能。检查和使用之间没有重复,这一直是一个大问题。
(注意,这种特殊类型的字符串转换实际上是用于调试和内部配置。它不处理语言环境和其他面向人的考虑。文件格式和有线协议的使用引入了对表示的强烈依赖性班级使用。)
答案 4 :(得分:4)
有两种已知方法可以“检查”前提条件。
LBYL:在你跳跃之前先看看
此编码样式在进行调用或查找之前显式测试前置条件。这种风格与EAFP方法形成对比,其特点是存在许多if语句。
EAFP:比获得许可更容易请求宽恕。这种常见的编码风格假设存在有效的密钥或属性,并且如果假设证明是错误则捕获异常。这种干净和快速的风格的特点是存在许多try和except语句。该技术与许多其他语言(如C。
)共有的LBYL风格形成对比对于有打字的语言,EAFP总是一个好主意。
这显然取决于你想做什么......如果你不确定要操纵的对象的类型,请使用EAFP。
答案 5 :(得分:1)
是的,这肯定与实用程序员关于“异常情况例外”概念的争论,但你认识到你正在做的事情,所以没有问题IMO
答案 6 :(得分:1)
评论kriss的回答: 我没有看到“精湛的内存泄漏”。没有引用创建的BigDecimal。只要此方法完成,并且我们超出范围,该对象就有资格进行垃圾回收。
当我们保存不再需要的引用时会发生内存泄漏,因此无法对对象进行垃圾回收。
答案 7 :(得分:1)
Try / Catch块永远不应该用于逻辑。
答案 8 :(得分:0)
当然,为什么不呢。我们这样做是为了检查客户指定的电子邮件地址是否格式正确:
try
{
MailMessage m = new MailMessage(from, to, subject, body);
return true;
}
catch(SmtpFailedRecipientsException ex)
{
return false;
}
现在,人们可能会争论结构的性能或适当性,但他们忘记了简单性的权衡:
正如其他人在上面讨论的那样,这段代码最好被抽象为一个单独的实用程序类,而不是与主代码混合使用。
答案 9 :(得分:0)
在JVM的时间和资源方面,你必须考虑构造Exception对象是昂贵的,因为它必须构建strack跟踪。
所以你提出的建议是解决问题的一种简单但耗费资源的方法。
这个解决方案是否可接受,取决于您将给予此功能的用途以及您的效率要求。