技巧:当不能抛出异常时

checked 异常的一个问题是,有时候不允许抛出这样的异常。特别是,如果要覆盖超类中声明的方法,或者实现接口中声明的方法,而那个方法没有声明任何 checked 异常,那么新的实现也不能声明 checked 异常。因此必须预先处理异常。另外,可以将异常转换为运行时异常,或者绕过它而不处理它。但是,应该这样做吗,这其中是否隐藏着错误?

问题

只要看一个例子,问题就清楚了。假设有一个 File 对象的 List,需要按它们的标准路径以字典顺序排序。所谓标准路径,是指在解析别名、符号链接和 /../ 及 /./ 之后得到的完整绝对路径。本地方法使用一个比较器,如清单 1 所示:

清单 1. 按标准路径比较两个文件

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class FileComparator implements Comparator<File> {

   public int compare(File f1, File f2) {
     return f1.getCanonicalPath().compareTo(f2.getCanonicalPath());
   }

   public static void main(String[] args) {
    ArrayList<File> files = new ArrayList<File>();
    for (String arg : args) {
      files.add(new File(arg));
    }
    Collections.sort(files, new FileComparator());
    for (File f : files) {
      System.out.println(f);
    }
   }

}

不幸的是,该代码不能通过编译。问题在于,getCanonicalPath() 方法抛出一个 IOException,因为它需要访问文件系统。通常,当使用 checked 异常时,可以使用以下两种方法之一:

将出错的代码包装在一个 try 块中,并捕捉抛出的异常。

声明包装方法(本例为 compare())也抛出 IOException。

通常,至于选择何种方法,取决于是否能在抛出异常时合理地处理异常。如果能,那么使用 try-catch 块。如果不能,那么声明包装方法本身抛出异常。不幸的是,这两种技巧对于本例都不管用。

在 compare() 方法中无法合理地处理 IOException。从技术上讲,似乎可以做到 — 即返回 0、1 或 -1,如清单 2 所示:

时间: 2024-08-27 19:20:41

技巧:当不能抛出异常时的相关文章

throws-Java抛出异常时用e.printStackTrace()怎么会说没有返回值呢?

问题描述 Java抛出异常时用e.printStackTrace()怎么会说没有返回值呢? public Socket getSocket() { try { Socket socket =new Socket("localhost",8088); return socket; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } 这里要报错,没有返回值 public So

java-关于Java抛出异常时,运行结果不确定的问题

问题描述 关于Java抛出异常时,运行结果不确定的问题 main函数代码如下: public static void main(String[]agrs)throws Exception { System.out.println(1); throw new Exception(); }不断重复运行,输出结果有两种:第一种(我认为是符合预期的结果)-- ------------------------------------------1Exception in thread ""mai

异常 定位-抛出异常时怎么定位到抛出异常的那一行代码?

问题描述 抛出异常时怎么定位到抛出异常的那一行代码? 问个比较低级的问题:就抛出异常的时候怎么能得到具体是哪一行代码抛出的? 解决方案 我还正想问怎么把自己的解决办法贴上来呢.我那个问题类似一般就可以用ex.StackTrace()显示问题和定位出问题的方法和行号,但是我的问题还有点特殊,用了这个方法并不能定位到哪一行,只是定位到了出问题的方法.因此StackTrace只是一般的方法 解决方案二: c语言:用宏函数__LINE__;C++/JAVA:如果是自定义异常,Thow MyExcepti

《jQuery、jQuery UI及jQuery Mobile技巧与示例》——9.12 技巧:跨页面时固定footer

9.12 技巧:跨页面时固定footer 点击链接时,在页面发生变化期间会触发动画.有些情形下你并不想让footer成为动画的一部分.代码清单9-14演示了当链接至别的页面时如何将footer保持在同一个地方. 代码清单9-14 当页面发生变化时固定footer 00 <!DOCTYPE html> 01 <html> 02 <head> 03 <title>Fixed Footer</title> 04 <meta name="

Excel技巧:输入新数据时图表自动更新

  我有一朋友,是做销售的.他利用Excel图表来记录每天的销售成绩.那天,他打来电话问了这样一个问题:用Excel来记录每天的销售非常的方便,能够直观地表示出每天的销售成绩,但是因为每天都有新的数据,所以我不得不每天手动更改图表来使其包含新的数据.有没有一种方法可以让我输入新的数据时,图表能自动更新.下面的方法将为他来解决这个问题. 在Excel 97及以后版本中,当选中一个图表数据系列时,工作表中与该数据系列对应的数据区域周围就会出现边框,这时可以通过简单地拖拽区域边框的角点来扩展数据区域.

MAC使用技巧之装windows时mac键盘不再失灵的诀窍

  苹果电脑用户在装windows的时候估计大家都遇到过键盘失灵的情况,有人说是键盘过热的原因,最近发现2个小诀窍可以不用等电脑冷下来也不用多次重启直接可以用键盘的方法. 按option开机选择安装光盘后,当安装的选项菜单或者画面还没有出来的时候就开始不停地按方向键或者别的对选项没有影响的键,不然会造成误选的情况,当安装菜单出现以后,便会发现键盘可以用了.试了几次都成功.需要的可以试一下. 还有第二种方法:最简单的方法是:大家在装xp系统时都插鼠标了吧,记得把鼠标拔了就没事了!

Visual Studio小技巧:复制代码时,保留原ID

在我们开发过程中,经常会复制一些代码,而Visual Studio会自动把这些代码的ID重新生成,常常导致我们还必须去修改回原ID 其实,Visual Studio是可以保留原始ID的.我们可以通过在Tools- >Options->Text Editor->HTML->Miscellaneous中,把Auto ID elements on paste in Source View前面的勾去掉就可以. 如图所示 另外: 最近在研究SharePoint 工作流,最开始一头雾水,对In

CSS技巧DIV为空时占据空间的解决办法_经验交流

此时在IE中到底是什么在影响着最终的显示,又是如何解析的呢? 可能的影响因素:字体大小(font-size),字体行高(line-height),高度(height),溢出(overflow) 我们对上面的代码逐一添加过滤属性(具体的过程有兴趣的朋友,可以私下里实验一下,"自己动手,丰衣足食"!) 在测试的过程中,你会发现IE6和IE7的解析也不尽相同,比如在给div设置了line-height:0; height:0; 的样式后,IE7中显示正常了,不再占据物理空间了,而IE6却依然

看电影时禁止打扰!风行使用小技巧

风行网络电影是一款集下载.点播于一体的网络影视播放平台,使用风行即可以实现BT高速下载,又能够实现边下边看,只需短暂的缓冲就可以在线点播网络电影,笔者在使用过程中发现了一个看电影时不被打扰的使用技巧,下面与大家一起分享. 大部分人为了保护显示器,一般都设置了屏幕保护程序,有的人甚至设置了关闭显示器与休眠的时间等,这样在你设置的时间里,如果没有人操作电脑,显示器就会自动进入屏幕保护.关闭显示器或进入休眠状态,达到保护显示器的目的. 但是当你在使用风行欣赏精彩电影的时候,如果电脑会自动进入屏幕保护程