Questions tagged «checked-exceptions»

21
了解Java中的已检查异常与未检查异常
约书亚·布洛赫(Joshua Bloch)在《有效的Java》中说 将检查的异常用于可恢复的条件,将运行时异常用于编程错误(第二版中的项目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 } 1.以上是否被视为经过检查的异常? 2. RuntimeException是未经检查的异常吗? 这是我对未经检查的异常的理解: try{ File file = new File("my/file/path"); FileInputStream fis = new FileInputStream(file); }catch(FileNotFoundException e){ //3. …

30
针对检查异常的情况
多年以来,我一直无法获得以下问题的正确答案:为什么有些开发人员反对检查异常?我进行了无数对话,阅读了博客上的东西,阅读了布鲁斯·埃克尔(Bruce Eckel)所说的话(我看到的第一个反对他们的人)。 我目前正在编写一些新代码,并非常注意我如何处理异常。我正在尝试查看“我们不喜欢检查的异常”人群的观点,但我仍然看不到它。 我的每一次对话都以相同的问题为结尾而结束...让我进行设置: 总体而言(根据Java的设计方式), Error 用于永远不应该抓到的东西(VM有花生过敏症,有人在上面撒了一罐花生) RuntimeException 用于程序员做错了的事情(程序员走出了数组的结尾) Exception(除外RuntimeException)用于程序员无法控制的事情(写入文件系统时磁盘已满,已达到该进程的文件句柄限制,并且您无法打开任何其他文件) Throwable 只是所有异常类型的父级。 我听到的一个常见论点是,如果发生异常,那么开发人员要做的就是退出程序。 我听到的另一个常见论点是,检查异常会使重构代码更加困难。 对于“我要做的就是退出”参数,我说即使您要退出,也需要显示一条合理的错误消息。如果您只是在处理错误,那么当程序退出时如果没有明确说明原因的话,您的用户将不会过分高兴。 对于“它很难重构”人群,这表明未选择适当的抽象级别。与其声明方法不会引发IOException,不IOException应该将转换为更适合发生的异常。 我在将Main换成catch(Exception)(或在某些情况下catch(Throwable)确保程序可以正常退出)时没有问题-但我始终会捕获所需的特定异常。这样做至少可以显示一个适当的异常。错误信息。 人们从不回覆的问题是: 如果您抛出RuntimeException 子类而不是Exception 子类,那么您如何知道应该掌握什么呢? 如果答案是Exception问题,那么您也将以与系统异常相同的方式处理程序员错误。对我来说这似乎是错误的。 如果您发现了问题,Throwable那么您将以相同的方式处理系统异常和VM错误(等等)。对我来说这似乎是错误的。 如果答案是仅捕获已知的异常,那么您如何知道抛出了哪些异常?当程序员X抛出一个新异常而忘记捕捉它时,会发生什么?对我来说这很危险。 我会说显示堆栈跟踪的程序是错误的。不喜欢检查异常的人会不会有这种感觉? 因此,如果您不喜欢检查异常,是否可以解释为什么不这样做并回答未得到回答的问题? 编辑:我不是在寻找关于何时使用任何一种模型的建议,我正在寻找的是人们为什么从中扩展,RuntimeException因为他们不喜欢从中扩展Exception和/或为什么他们捕获异常,然后重新抛出RuntimeException而不是向其添加抛出他们的方法。我想了解不喜欢检查异常的动机。

17
如何从Java 8流中引发CHECKED异常?
如何从Java 8流/ lambda中抛出CHECKED异常? 换句话说,我想使代码像这样编译: public List<Class> getClasses() throws ClassNotFoundException { List<Class> classes = Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String") .map(className -> Class.forName(className)) .collect(Collectors.toList()); return classes; } 该代码无法编译,因为Class.forName()上面的方法抛出ClassNotFoundException,因此。 请注意,我不想将已检查的异常包装在运行时异常中,而是抛出已包装的未检查的异常。我想抛出被检查的异常本身,而又不添加丑陋的try/ catches流。

18
何时选择已检查和未检查的异常
在Java(或任何其他具有检查的异常的语言)中,当创建自己的异常类时,如何决定应检查还是不检查它? 我的直觉是,在调用者可能能够以某种有生产力的方式恢复的情况下,将要求使用检查异常,而对于无法恢复的情况,未检查异常将更多,但我会对其他人的想法感兴趣。


8
Java 8:lambda表达式中的强制检查异常处理。为什么是强制性的而不是可选性的?
我正在使用Java 8的新lambda功能,发现Java 8提供的实践确实很有用。但是,我想知道是否有一种很好的方法来解决以下情况。假设您有一个对象池包装器,需要某种工厂来填充对象池,例如(使用java.lang.functions.Factory): public class JdbcConnectionPool extends ObjectPool<Connection> { public ConnectionPool(int maxConnections, String url) { super(new Factory<Connection>() { @Override public Connection make() { try { return DriverManager.getConnection(url); } catch ( SQLException ex ) { throw new RuntimeException(ex); } } }, maxConnections); } } 将功能接口转换为lambda表达式后,上面的代码变为: public class JdbcConnectionPool extends ObjectPool<Connection> { …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.