java异常结构和处理
- 异常结构
- 异常处理
异常结构
Error : JVM错误,无法处理
Exception :
- 运行期异常
- 编译期异常
异常处理
一般只针对编译期异常
五个关键字-----> try 、catch、finally、throw、throws
1.try…catch…
public static void main(String[] args) {
try {
Class c = Class.forName("d1");
Thread.sleep(1000);
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
1、try
用try来捕获可能发生异常的语句,且try块中的语句都是程序正常要执行的语句,把可能发生异常的语句就放在try块中
注意:
- 1).如果当前try块中存在多条可能发生异常的代码A,B,C三条语句,如果A发生异常,此时B,C不会被执行到。
- 2).try块尽量避免嵌套
2、catch—>(尽量避免过细划分)
一个try块可有多个catch语句,catch块用于处理try块中的异常,且catch块语句需要一个形式参数指明处理的异常
注意:1).先用关心的子类处理,再用父类处理(假设try中有可能发生的异常的代码A,B,C,当catch捕获A 的异常时,剩下的异常B,C的catch不再进行匹配)
try{
//代码代码
A; B; C; D;
}catch(异常类型,异常的变量名e){
e.printStackTrace(); //A的
}catch(异常类型,异常的变量名e){
e.printStackTrace(); //B的
}catch (Exception e){
e.printStackTrace(); //C,D的
}
//如果只考虑A的异常,剩下的异常可以catch (Exception e) 处理剩下的
2.finally----->特点是:无论try块中的语句 是否 发生异常,finally里中的语句必定会被执行到;
public static void main(String[] args) {
try {
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
} finally {
System.out.println("eee");
}
}
}
常见问题:
- 如果try块包含return;并且finally块也包含return,此时从哪退出
try块里有return,在执行try块的return之前调用finally执行,从finally里return退出 - 如果try里面包含退出System.exit();finally里也包含,此时从哪退出:
从try块中exit中退出,强制退出
3.throw
扔异常对象
public int peek(){
if(size == 0) {
throw new EmptyStackException();
}
return element[size-1];
}
4.throws
void fun() throws 异常 { }
方法抛出异常时,方法会从栈被取出,而异常会再丢给栈上的方法,并未处理
//可同时指明多个异常,用逗号隔开
public static void fun() throws InterruptedException, ClassNotFoundException {
Thread.sleep(1000);
Class c = Class.forName("d1");
}
//也可以全部用Exception全部抛出
public static void fun() throws Exception {
Thread.sleep(1000);
Class c = Class.forName("d1");
}
throws抛出异常:出现了异常,不做任何处理
throw 是语句抛出一个异常;throws 是方法抛出一个异常
总:
throw 是语句抛出一个异常;throws 是方法抛出一个异常
异常处理方式:
- try…catch…finally 进行捕获处理
- throw、throws 声明抛出异常不处理