日期:2014-05-20  浏览次数:21015 次

throws 和 throw new RuntimeException 和 try-catch的区别,在什么情况下使用,三者之间的关系
三者在一个方法中可以同时用吗,为什么在方法中已经try-catch()还要使用throw new RuntimeException(e)


public static int readInt(File file){
//FileReader是一个读取字符文件的便捷类。

BufferedReader reader = null;
try{
FileReader fr = new FileReader(file);
reader = new BufferedReader(fr);
String str = reader.readLine();
int i = Integer.parseInt(str);
return i;
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException(e);
}finally{
if(reader != null){
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

------解决方案--------------------
用了throws就不用try-catch了,他会自动捕捉异常然后抛出

像这个在catch中再throw new RuntimeException的,是为了中断程序,因为runtime的异常会中断程序,不再运行下去
------解决方案--------------------
Exception 包括 非检查性异常 RuntimeException 和检查性异常 如: IOException之类,
两种异常的区别
非检查性异常 及子类,程序中可以不处理,但是运行时会报异常.
检查性异常及子类,程序中必须处理,其它一样.
而你的IOException 是必须处理的, 在这里转化成 RuntimeException 之后,其它程序调用就可以不处理,
但是又能在出错时报出异常信息.
关于java的异常机制,楼主要多补些课.
------解决方案--------------------
很明显,如果不throw new RuntimeException(e); 出异常,后面的程序是无法知道出错, 只能看日志,
所以代码增加这个并不是多余的. 不过 e.printStackTrace(); 这句是完全可以不要的,
有了throw new RuntimeException(e); 总会有某个地方报错的, 作者打印出来,估计是没信心.
------解决方案--------------------
这里只是做判断把 if read!=null 是一个健壮写法,如果对象=null 调用其方法岂不是 会抛出空指针