我已经在StackOverFlow上阅读了有关已检查和未经检查的异常的多个帖子.老实说,我还是不太确定如何正确使用它们.
Joshua Bloch在" Effective Java "中说过
对可恢复条件使用已检查的异常,对编程错误使用运行时异常(第2版中的第58项)
让我们看看我是否正确理解这一点.
以下是我对已检查异常的理解:
try{
String userInput = //read in user input
Long id = Long.parseLong(userInput);
}catch(NumberFormatException e){
id = 0; //recover the situation by setting the id to 0
}
Run Code Online (Sandbox Code Playgroud)
1.以上是否考虑了检查异常?
2. RuntimeException是未经检查的异常吗?
以下是我对未经检查的异常的理解:
try{
File file = new File("my/file/path");
FileInputStream fis = new FileInputStream(file);
}catch(FileNotFoundException e){
//3. What should I do here?
//Should I "throw new FileNotFoundException("File not found");"?
//Should I log?
//Or should I System.exit(0);?
}
Run Code Online (Sandbox Code Playgroud)
4.现在,上述代码也不能成为检查异常吗?我可以尝试恢复这样的情况吗?我可以吗?(注意:我的第3个问题在catch
上面)
try{
String …
Run Code Online (Sandbox Code Playgroud) java exception runtimeexception checked-exceptions unchecked-exception
在Java(或任何其他具有已检查异常的语言)中,在创建自己的异常类时,如何确定是应该选中还是取消选中它?
我的直觉是,如果调用者能够以某种富有成效的方式恢复,那么将调用一个已检查的异常,其中未经检查的异常对于不可恢复的情况更多,但我会对其他人的想法感兴趣.
假设我们有这样的结构:
Try
' Outer try code, that can fail with more generic conditions,
' that I know less about and might not be able to handle
Try
' Inner try code, that can fail with more specific conditions,
' that I probably know more about, and are likely to handle appropriately
Catch innerEx as Exception
' Handle the inner exception
End Try
Catch outerEx as Exception
' Handle outer exception
End Try
Run Code Online (Sandbox Code Playgroud)
我已经看到一些意见认为这样的嵌套Try
块是不鼓励的,但我找不到任何具体的原因.
这是坏代码吗?如果是这样,为什么?
例如,框架/ JDK中的许多方法可能会抛出
java.lang.SecurityException
Run Code Online (Sandbox Code Playgroud)
但是这没有在方法签名中指出(因为这是通常为已检查的异常保留的做法).我想说,在方法sigs中声明RuntimeExceptions有许多好处(例如类似于静态类型检查).我喝醉了还是其他的?
我什么时候应该从中派生例外RuntimeException
而不是Exception
?
A RuntimeException
不必在方法的throws
子句中声明,这可能是好的,因为它不必特别列出或坏,因为显式声明方法的异常是一种好习惯.
思考?
我有一个函数来计算作为参数传递的列表的平均值.我想知道当我尝试计算大小为0的列表的平均值时,我应该抛出哪个Java异常.
public double mean (MyLinkedList<? extends Number> list)
{
if (list.isEmpty())
throw new ????????; //If I am not mistaken Java has some defined exception for this case
//code goes here
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
我在SO上进行了这个伟大的讨论,标题为:针对已检查异常的情况,但是我无法遵循应该使用RuntimeException的地方以及它与正常异常及其子类的不同之处.谷歌搜索给了我一个复杂的答案,也就是说,它应该用于处理编程逻辑错误,并且应该在没有正常情况发生时抛出,例如在switch-case结构的默认块中.
你能否在这里详细解释一下RuntimeException.谢谢.
我研究过:然而,对于未经检查的异常,编译器不会强制客户端程序员捕获异常或在throws子句中声明它.事实上,客户端程序员可能甚至不知道可能抛出异常.例如,StringIndexOutOfBoundsException
由String的charAt()
方法抛出.
这是什么意思?
根据该代码,不需要在代码中放置try catch块,但我已经看到编译器强制将代码放入try catch块中.
我很困惑他们到底是什么?
我意识到已经 充分 讨论了检查异常与Java中未经检查的异常的相对优点,我不打算重新审视整个辩论.
相反,当我阅读Joshua Bloch的Effective Java,第2版时,我想问一个非常具体的问题.在我阅读时,我注意到在第59项("避免不必要地使用已检查的异常")中,Joshua在Java API中给出了一个使用已检查异常的示例.具体来说,在Object
:
protected Object clone()
throws CloneNotSupportedException
Run Code Online (Sandbox Code Playgroud)
...然后争辩说它应该是一个未经检查的例外.
如果使用API的程序员不能做得更好,那么未经检查的异常会更合适.未通过此测试的异常的一个示例是CloneNotSupportedException.它由Object.clone引发,只应在实现Cloneable(Item 11)的对象上调用它.实际上,catch块几乎总是具有断言失败的特征.异常的检查性质对程序员没有任何好处,但它需要努力并使程序复杂化.
然后我看着他是否有一个反向的例子,但我找不到一个.
所以我想问一下是否有人可以在Java中提供一个使用未经检查的异常的API示例,但是检查异常是更好的选择,并解释原因.一个现实世界的例子会更可取,但如果能够说明问题的话,我愿意接受一个人为的例子.
编辑: 对于那些投票决定将其视为非建设性的人,我想明确表示我不是在寻找意见,辩论,争论或扩展讨论.我也不参加民意调查.相反,我正在寻找能够清楚地分析收益如何超过成本的例子.(隐含的是承认有成本.)那就是说,我怀疑这个问题的性质是否有可能.我估计Jon Skeet不能这样做,它不可能完成.也许你是对的.如果必须,请关闭.
编辑:虽然我对这个回复不感兴趣,但我只是因为我的接受率而将此奖励给Jon.
我在RuntimeException上听到了很多关于异常的事情,但没有给出明确的参数.我也看到很多关于Stack Overflow的主题,但似乎没有人直接提出这个问题(如果是这种情况,感谢关闭它作为重复并显示链接!)
我想明确知道何时使用RuntimeException以及何时使用经典Exception.
对于业务逻辑(即异常可能是用户错误(错误数据)),您是使用异常还是运行时?
当您创建自己的异常(在业务逻辑中)时,您是否有2或3个建议您选择抛出异常或运行时异常?