我担心这是一个运行时异常,所以应该谨慎使用。
标准用例:
void setPercentage(int pct) {
if( pct < 0 || pct > 100) {
throw new IllegalArgumentException("bad percent");
}
}
但这似乎会迫使以下设计:
public void computeScore() throws MyPackageException {
try {
setPercentage(userInputPercent);
}
catch(IllegalArgumentException exc){
throw new MyPackageException(exc);
}
}
将其恢复为检查异常。
好吧,但我们还是继续吧。如果输入错误,则会出现运行时错误。因此,首先,这实际上是一个很难统一实施的政策,因为您可能需要进行相反的转换:
public void scanEmail(String emailStr, InputStream mime) {
try {
EmailAddress parsedAddress = EmailUtil.parse(emailStr);
}
catch(ParseException exc){
throw new IllegalArgumentException("bad email", exc);
}
}
更糟糕的是,在检查0时
所以基本上我要说的是,我没有看到使用
IllegalArgumentExc0019
的有意义的一致策略。似乎不应该使用它,我们应该坚持我们自己检查的异常。抛出这个的好用例是什么?
“谨慎地”抛出运行时异常并不是一个好策略——有效Java建议在合理预期调用方会恢复时使用检查的异常。(程序员错误是一个特定的例子:如果一个特定的情况表明程序员错误,那么你应该抛出一个未经检查的异常;你希望程序员有一个逻辑问题发生的堆栈跟踪,而不是试图自己处理它。)
如果没有恢复的希望,那么请随意使用未检查的异常;捕捉它们没有意义,所以这很好。
不过,从您的示例中还没有100%清楚这个示例在您的代码中是哪种情况。
当谈到“坏输入”时,你应该考虑输入是从哪里来的。
如果输入是由用户或您不控制的另一个外部系统输入的,您应该期望输入无效,并始终验证它。在这种情况下,抛出一个选中的异常是完全可以的。您的应用程序应该通过向用户提供错误消息从该异常中恢复。
如果输入源于您自己的系统,例如您的数据库或应用程序的某些其他部分,则您应该能够依赖它来验证其有效性(它应该在到达之前经过验证)。在这种情况下,抛出未经检查的异常(如IllegalArgumentException)是完全可以的,它不应该被捕获(通常,您永远不应该捕获未经检查的异常)。这是一个程序员的错误,一开始就出现了无效值;)你需要修理它。
IllegalArgumentExc0019
的API文档:
抛出以指示已向方法传递非法或不适当的参数。
通过查看它在JDK库中的使用情况,我想说:
>
这似乎是一种防御措施,在输入进入工作之前抱怨明显糟糕的输入,并导致一些东西在中途失败,发出荒谬的错误信息。
它用于抛出检查过的异常(尽管它出现在java.lang.reflect代码中,但在其他情况下,对检查过的异常抛出的荒谬级别的担忧并不明显)太烦人的情况。
我将使用IllegalArgumentExc0019
对常见实用程序进行最后一道防御性参数检查(试图与JDK使用保持一致)。或者期望一个坏参数是程序员错误,类似于NullPointerExc0019
。我不会用它来实现业务代码中的验证。我当然不会在电子邮件示例中使用它。
问题内容: 我担心这是运行时异常,因此应谨慎使用。 标准用例: 但这似乎会强制执行以下设计: 使它回到被检查的异常。 好的,但是让我们开始吧。如果输入错误,则会出现运行时错误。首先,这实际上是统一实施的相当困难的策略,因为您可能必须执行相反的转换: 更糟的是-虽然可以预期客户端代码将以静态方式进行检查,但对于更高级的数据(例如电子邮件地址)却并非如此,或更糟糕的是,必须对数据库进行检查,因此,一般
问题内容: 在我的应用程序中,有时会引发以下异常: 很难找到错误,因为在stacktrace中没有列出我的方法。那么,有人知道何时抛出此异常吗?感谢您的任何提示。 问题答案: 您可以在stacktrace中看到错误: 适配器的内容已更改,但ListView没有收到通知。确保不从后台线程修改适配器的内容,而仅从UI线程修改。 您应该调查一个线程,并使其与UI线程同步。 在Android中执行此操作的
我们应该在什么时候选择抛出一个异常? 我们可以在try catch中捕获此异常。 在哪种情况下,我们选择使用投掷而不是立即接球?是否与设计模式相关?
问题内容: 我知道他们两个都禁用了Nagle的算法。 我什么时候应该/不应该使用它们中的每一个? 问题答案: 首先,不是所有人都禁用Nagle的算法。 Nagle的算法用于减少有线中更多的小型网络数据包。该算法是:如果数据小于限制(通常是MSS),请等待直到收到先前发送的数据包的ACK,同时累积用户的数据。然后发送累积的数据。 这将对telnet等应用程序有所帮助。但是,在发送流数据时,等待A
问题内容: 在该类中,有两个字符串,和。 有什么不同?我什么时候应该使用另一个? 问题答案: 如果你的意思是和则: 用于在文件路径列表中分隔各个文件路径。考虑在上的环境变量。您使用a分隔文件路径,因此在上将是;。 是或用于拆分到特定文件的路径。例如在上,或
我已经用Java编写代码一段时间了。但有时,我不知道什么时候应该抛出异常,什么时候应该捕获异常。我正在做一个有很多方法的项目。层次结构是这样的- 所以目前我正在做的是-我在所有方法中抛出异常并在方法A中捕获它,然后将其记录为错误。 但我不确定这是否是正确的方法?或者我应该开始在所有方法中捕获异常。这就是为什么这种混乱始于我的 - 我什么时候应该抓住异常与何时应该抛出异常。我知道这是一个愚蠢的问题,