是否可以尝试/抓住一些东西来检查是否抛出exception?
是否尝试一些无用的方法来查看这个代码是否抛出了一个特殊的exception?
抛出exception时我想做些什么,除此之外什么也不做。
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;
testing有太多的先决条件,构造函数BigDecimal()总是检查它们,所以这看起来是最简单的方法。
一般来说,应该避免这种做法。 但是由于没有实用的方法isValidBigDecimal(..)
,那就是要走的路。
正如Peter Tillemans在评论中指出的,将这些代码放在一个名为isValidBigDecimal(..)
的实用程序方法中。 因此,您的代码将不知道确定有效性的方式,您甚至可以稍后切换到另一种方法。
鲍里斯·帕夫洛维奇(BorisPavlović)build议select使用第三方库(commons-lang)进行检查。 还有一个更有用的方法,我使用时,我需要validation数字 – NumberUtils.isNumber(..)
如果您不喜欢使用这种方法,请尝试使用Apache Commons Validator中的 BigDecimalValidator
。 如果inputString
无效,则返回null
。
这样做没有错, 毕竟,某种其他语言的支持者喜欢说“道歉比请求许可更容易”,就是说,等待某件事情失败和处理比容易完全避免失败更容易。 在这种情况下,由于没有其他select,所以绝对要去做。
性能可能不是很好,语法冗长,但代码是非常精确的。 检查和使用之间没有重复,这一直是一个大问题。
(注意,string之间的这种转换实际上是用于debugging和内部configuration的,它并不处理区域设置和其他以人为本的考虑。在文件格式和有线协议中的使用引入了对类。)
有两种已知的方法来“检查”前提条件。
LBYL:看你跳跃之前
这种编码风格在进行调用或查找之前明确地testing前提条件。 这种风格与EAFP方法形成鲜明对比,其特点是存在许多if语句。
EAFP:比容许更容易要求原谅。
这种常见的编码风格假设存在有效的键或属性,并且如果假设certificate是错误的,则捕获exception。 这种干净而快速的风格的特点是存在许多尝试和除了声明。 该技术与许多其他语言如C.的LBYL风格形成对比
对于有鸭子打字的语言,EAFP总是一个好主意。
这显然取决于你想要做什么…如果你不确定要操作的对象的types,使用EAFP。
是的,这当然是与“实例程序员”的例外情况的争论,但你认识到你在做什么,所以没有问题IMO
对kriss的回答的评论:我没有看到这里“高超的内存泄漏”。 没有提到创build的BigDecimal。 一旦这个方法完成,我们超出范围,对象就有资格进行垃圾回收。
当我们持有我们不再需要的引用时发生内存泄漏,所以对象不能被垃圾回收。
尝试/ Catch块不应该用于逻辑。
您必须考虑构buildException对象在JVM的时间和资源方面是非常昂贵的,因为它必须构造strack trace。
所以你提出的解决这个问题是一个简单而又耗费资源的方法。
因此,这个解决scheme是否可以接受取决于您将要使用的function,以及您的效率要求。
当然,为什么不呢。 这是我们要检查客户指定的电子邮件地址是否格式正确:
try { MailMessage m = new MailMessage(from, to, subject, body); return true; } catch(SmtpFailedRecipientsException ex) { return false; }
现在,人们可能会争论结构的性能或适当性,但他们忘记了简单的权衡:
- 上面的代码会捕获.NET接受的EXACT数据格式。 任何分析过电子邮件地址的人都会知道,在正确格式的电子邮件地址结构中存在很大的差异。 这个代码保证以.NET喜欢的方式validation电子邮件地址结构,而不是我认为它应该的方式。
- 这个exception捕捉多个用例,而不仅仅是基本数据结构的正确性。 它将validationCC,BCC和TO字段中的多个用户,这些字段开始用手写代码难以处理。
正如其他人在上面讨论的,这个代码最好抽象成一个单独的工具类,而不是混入你的主代码。