文章尽量做到简练概述
通过对异常的分类和处理方式来理解有关异常的认识和处理
-
异常分类
-
异常处理
-
throws和try..catch...(finnaly...)代码实例
-
温馨提示:规范与常见异常(interview)
Exception分为编译时异常和运行时异常
- 编译时异常必须处理
- 处理分为JVM处理--手动处理(抛出和捕获)
在此不过多讲述知识面的内容,很多书本和资料都有,只希望看完这篇文章可以清晰的处理异常,什么时候怎么用Throws和try...catch...
方式(1):thorws-->在出现异常的方法上,将异常抛出给调用者,调用者也可以继续把这个异常抛出去
public static void main(String[] args) throws FileNotFoundException {
System.out.println("开始");
copy(); // 此时这里必须处理这个编译时异常
System.out.println("结束");//不打印
}
/*public static void main(String[] args){
System.out.println("程序开始");
try {
copy(); // 此时这里必须处理这个编译时异常
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println("程序结束");
}*/
public static void copy() throws FileNotFoundException {
File file = new File("D:/meinv.jpg");
// 自动出现一个编译时异常: 编译时异常编译阶段必须处理
InputStream is = new FileInputStream(file);
}
方式(2):try...catch...-->捕获并处理异常
格式 : try{ * // 可能出现异常的代码 * } catch(异常的类型 变量){ * // 如何处理 * }
提示:异常类型可以多个,也可以直接用Exception(不推荐)
public static void main(String[] args){
System.out.println("程序开始");
copy(); // 此时这里必须处理这个编译时异常
System.out.println("程序结束");
}
public static void copy() {
File file = new File("D:/meinv.jpg");
try {
// 自动出现一个编译时异常: 编译时异常编译阶段必须处理
// 出现异常 自己解决!
InputStream is = new FileInputStream(file);
} catch (FileNotFoundException e) {
// 输出异常信息,打印异常栈信息!程序不会死亡了,因为自己处理了!
e.printStackTrace();
}
}
在以上代码中演示了,在main方法调用自定义方法,对编译异常的处理,
第1段代码在方法中抛出,调用者必须处理,可以继续抛出或者try...catch...
第2段代码如果已经try...catch...代表已经捕获并处理异常,在主方法中并不会报错,不影响后面代码的运行
理解好以上编译时异常,那么接下来更好接受运行时异常的处理!!!
运行时异常的处理:
在编译阶段,运行时异常即使不处理也不会报错!
运行时异常是无需通过 throws 往外抛出的,自动抛出的,程序员无需理会!
public static void main(String[] args) {
try{
System.out.println(chu(1,0));
}catch (ArithmeticException e){
e.printStackTrace(); // 打出异常信息
System.out.println("我拦截到了异常!");
}
System.out.println("继续执行!");
}
public static int chu(int a , int b){ //throws ArithmeticException{
System.out.println(a);
System.out.println(b);
// ArithmeticExceptio 数学运算异常
int c = a / b ;
return c ;
}
提示:在规范中异常都应该处理
所以要考虑的只是,在哪个方法try...catch...;为不影响后面代码运行,即使不处理不报错,都应该选择try...catch...
拓展:
在try...catch...中,可以一个try...catch...catch...多个;也可以catch(异常1 | 异常2 ...变量)
注意:异常的级别关系
finally : 作用只有一个.关闭资源(无论程序是否出现异常,最终一定会执行一次finally)
释放资源,节约资源!
JDK1.7以后资源关闭的新方式:
try(
// 只能放资源,就会在资源用完以后会自动关闭,程序员无需理会!
){
}catch (Exception e){
e.printStackTrace();
}
自定义异常
throw new 异常类名(参数);
提示:在自定义一个RunnableException异常子类,在throw new 方法上不需要抛出throws(会有提示)
自定义异常的步骤:
* 定义一个异常的子类:XxxException
* 继承关系:RuntimeException或Exception
* 提供构造方法:无参数和有参数构造方法
throws 在方法上抛出异常
throw 创建并从这里抛出异常
最后:
编译时常见异常:
FileNotFoundException 文件找不到异常!
运行是异常:
ArrayIndexOutOfBoundsException 数组索引越界异常
NumberFormatException 数字转换异常
NullPointerException 空指针异常
ClassCastException 强制类型转换异常
面试可能会问到.