java - 我应该为无效输入抛出已检查或未检查的异常吗?
问题描述
我正在编写一个期望一些输入的方法。现在,我认为以防御方式编写它是一个好习惯(即检查输入是否正确)。
基本上,输入应该没问题,因为只有一个地方(可靠)使用这种方法。
所以我的问题是,
- 防御性编程在这里合理吗?
- 如果是这样,它应该抛出一个已检查或未检查的异常吗?
解决方案
想想如果您没有进行该检查并且输入了一些无效输入,系统或应用程序的其余部分会发生什么。
你有一个安全的默认值来回退和使用吗?它是否适用于所有情况?您的代码/API 的调用者/客户端是否需要得到通知?因此,基于此,您甚至可以只记录警告并继续使用默认值。但在大多数情况下,情况并非如此。
[..] 只有一个地方(可靠)使用这种方法。
到今天为止。将来,它可能会改变。因此,IMO,您可以检查输入是否有效。
它应该抛出一个已检查或未检查的异常吗?
这再次将我们带回到您的代码/API 的调用者或客户端。你想让他们期待它发生并处理它吗?如果他们可以处理异常并恢复,那么这是有道理的(注意:这意味着所有调用者try..catch
在调用您的 API/代码时都需要有一个块)。否则,如果他们应该传递一个有效的值,如果他们不传递,一个未经检查的异常会做(在合同/Javadoc中明确说明)
让我们看一个 Java 库本身的例子。
类中的许多方法File
都会引发检查异常。
Integer.valueOf
NumberFormatException
如果输入无效,则抛出一个(这是一个未经检查的异常)。
一个好的做法是,任何公共 API 都必须验证其输入。
另外,在决定之前看看Java:checked vs unchecked 异常解释
推荐阅读
- android - 仅当 ROOM 数据库中的行被删除时,如何显示 Toast?
- ios - 获取自己的蓝牙唯一 ID
- c# - 用于查找我的设备是否支持蜂窝连接的 API
- node.js - '@sailshq/socket.io-redis@latest' 不在 npm 注册表中
- javascript - Laravel 5.8 Pure Javascript Fetch AJAX PromiseStatus 返回被拒绝
- python-3.x - 即使 python 中的字符串是不可变的,该 sort 或 sorted 函数是如何工作的?
- php - 从表中获取最后一个 ID 号
- html - 纯CSS旋转动画在无限循环中被破坏
- powershell - 如何使用 Get-ChildItem 过滤掉锁定/被另一个进程文件使用?
- python - 如何查看 tkinter 条目小部件的结尾