java 7中的try catch除了之前谈到的新特性外,本文简单来例子小结下,其实还是有不少地方要注意的,首先看一个典型的代码:
先来两个异常类:
public class ExceptionA extends Exception{
public ExceptionA(String message){
super(message);
}
}
public class ExceptionB extends Exception{
public ExceptionB(String message){
super(message);
}
}
再创建一个资源类oldresource,如下:
public class OldResource{
public void doSomeWork(String work) throws ExceptionA{
System.out.println("Doing: "+work);
throw new ExceptionA("Exception occured while doing work");
}
public void close() throws ExceptionB{
System.out.println("Closing the resource");
throw new ExceptionB("Exception occured while closing");
}
}
我们开始使用之:
public class OldTry {
public static void main(String[] args) {
OldResource res = null;
try {
res = new OldResource();
res.doSomeWork("Writing an article");
} catch (Exception e) {
System.out.println("Exception Message: "+
e.getMessage()+" Exception Type: "+e.getClass().getName());
} finally{
try {
res.close();
} catch (Exception e) {
System.out.println("Exception Message: "+
e.getMessage()+" Exception Type: "+e.getClass().getName());
}
}
}
}
看输出:
Doing: Writing an article
Exception Message: Exception occured while doing work Exception Type: javaapplication4.ExceptionA
Closing the resource
Exception Message: Exception occured while closing Exception Type: javaapplication4.ExceptionB
再来看java 7中的新写法,代码如下:
public class NewResource implements AutoCloseable{
String closingMessage;
public NewResource(String closingMessage) {
this.closingMessage = closingMessage;
}
public void doSomeWork(String work) throws ExceptionA{
System.out.println(work);
throw new ExceptionA("Exception thrown while doing some work");
}
public void close() throws ExceptionB{
System.out.println(closingMessage);
throw new ExceptionB("Exception thrown while closing");
}
public void doSomeWork(NewResource res) throws ExceptionA{
res.doSomeWork("Wow res getting res to do work");
}
}
在JAVA 7中,要自动在try catch中利用到新特性,想不写那么多东西就关闭资源,则可以编写实现 AutoCloseable类的,则都可以利用该特性了。
在主程序中调用:
public class TryWithRes {
public static void main(String[] args) {
try(NewResource res = new NewResource("Res1 closing")){
res.doSomeWork("Listening to podcast");
} catch(Exception e){
System.out.println("Exception: "+
e.getMessage()+" Thrown by: "+e.getClass().getSimpleName());
}
}
}
输出结果为:
Listening to podcast
Res1 closing
Exception: Exception thrown while doing some work Thrown by: ExceptionA
大家可以思考下为什么这样输出,在新特性中,资源的自动关闭调用了close(),而
NewResource res = new NewResource("Res1 closing")){
已经为closingMessage赋值了,而最后的Exception e是输出了,suprred掉了
exception a和exception b的输出。
再看一个多层嵌套的try catch例子
public class TryWithRes {
public static void main(String[] args) {
try(NewResource res = new NewResource("Res1 closing");
NewResource res2 = new NewResource("Res2 closing")){
try(NewResource nestedRes = new NewResource("Nestedres closing")){
nestedRes.doSomeWork(res2);
}
} catch(Exception e){
System.out.println("Exception: "+
e.getMessage()+" Thrown by: "+e.getClass().getSimpleName());
}
}
}
输出:
Wow res getting res to do work
Nestedres closing
Res2 closing
Res1 closing
Exception: Exception thrown while doing some work Thrown by: ExceptionA
可以看到,后声明的资源上被最先CLOSE掉的,这里各自原先的exception都被supressed掉了。还可以用e.getSuppressed() 把屏蔽掉的exception都放来,比如
public class TryWithRes {
public static void main(String[] args) {
try(NewResource res = new NewResource("Res1 closing");
NewResource res2 = new NewResource("Res2 closing")){
try(NewResource nestedRes = new NewResource("Nestedres closing")){
nestedRes.doSomeWork(res2);
}
} catch(Exception e){
System.out.println("Exception: "+
e.getMessage()+" Thrown by: "+e.getClass().getSimpleName());
if (e.getSuppressed() != null){
for (Throwable t : e.getSuppressed()){
System.out.println(t.getMessage()+
" Class: "+t.getClass().getSimpleName());
}
}
}
}
}
输出显示:
Wow res getting res to do work
Nestedres closing
Res2 closing
Res1 closing
Exception: Exception thrown while doing some work Thrown by: ExceptionA
Exception thrown while closing Class: ExceptionB
Exception thrown while closing Class: ExceptionB
Exception thrown while closing Class: ExceptionB