java异常指在程序运行时可能出现的一些错误,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,中断了正在执行的程序的正常指令流。
Java通过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的错误条件。当条件生成时,错误将引发异常。对于运行时异常、错误或可查异常,Java技术所要求的异常处理方式有所不同。
Q: Throwable 和 Error的关系
A: Throwable是Error(错误)的基类,也是Exception的基类
1个好图,可看到常见的异常和error
Q: Error和Exception的关系
A:
Q: Error可以被catch捕捉吗?
A: 只要是Throwable和其子类都是可以throw和catch的。 但是不建议捕捉Error。
异常体系还可以分为这2类:
Q: return-finally陷阱1: finally能通过修改变量,来更新return的变量值吗
int f() {
int a = 1;
try {
return a;
}
finally {
a=2;
}
}
A: 不能, f返回1。
Q: return-finally陷阱2: finally里也return时,返回哪个?
int f() {
try {
return 1;
}
finally {
return 2;
}
}
A:返回finally里的,返回2。
Q: 什么情况下finally块里的步骤可以不执行?
A: 只有在finally之前调用System.exit(0)退出jvm, 才能让finally不执行。
Q: 下面会发生什么?
try {
start();
} catch (Exception ex) {
System.out.println("catch Exception");
} catch (RuntimeException re) {
System.out.println("catch RuntimeException");
}
A: 直接编译就错误了。 catch是会按顺序的且匹配1个就不再往下匹配,编译器因此识别出RuntimeExcpetion永远不会被捕捉到,便提前报错。
Q:throw异常的时候,在finally中做return,那么异常还会抛出吗?
static int f() {
try {
int a = 1/0;
return a;
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
return -1;
}
}
public static void main(String[] args) {
System.out.println(f());
}
A:不会,返回-1.
即finaly中做return会中断throw
因此永远不要在finally中去做return操作
Q: 子类覆写基类方法时 , 能throws基类方法中不存在的异常吗?
像下面这样:
class A{
void f() throws IOException{
}
}
class B extends A{
void f() throws IOException, SQLException {
}
}
A: 不行,直接编译报错。 即子类覆写父类方法时, throws关键字后面跟的异常必须是小于等于父类方法异常的。
Q: finally中调用某资源的close时,也会抛出受检异常, 除了在finally里做try-catch,还能怎么做?
像下面这样,finally又有catch,就很难看:
TryWithResource tryWithResource = new TryWithResource();
try {
System.out.println(tryWithResource.age);
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
tryWithResource.close();
} catch (Exception e) {
e.printStackTrace();
}
}
A:如果是JDK1.7,可以用try-with-resource语法。
需要资源类实现AutoCloseable接口, 并在try的时候在try括号后面跟上资源的创建,如下:
本文系作者在时代Java发表,未经许可,不得转载。
如有侵权,请联系nowjava@qq.com删除。