一、异常的分类
Exception:可以自己处理解决的问题
RuntimeException:运行时异常
Error:不应该试图捕捉的严重问题(字节码文件无法解析,java虚拟机资源耗尽,配置文件格式不规范) (解决方法:重新编写程序、重新分配系统资源)
二、捕捉异常
1、try catch语句捕捉异常:
try{ //被捕获的代码 } catch(异常类型e){ //对异常的处理 }
2、多重try—catch代码块
package 异常; public class buzhuoyichang { public static void main(String[] args) { try { int a=1/0; }catch(ArithmeticException e) { System.out.println("算数发生了异常,请管理员及时处理"); } catch(NullPointerException e) { System.out.println("发生了空指针异常,请管理员及时处理"); } catch(ClassCastException e) { System.out.println("发生了类转换异常,请管理员及时处理"); } try { Object obj=null; obj.hashCode(); }catch(ArithmeticException e) { System.out.println("算数发生了异常,请管理员及时处理"); } catch(NullPointerException e) { System.out.println("发生了空指针异常,请管理员及时处理"); } catch(ClassCastException e) { System.out.println("发生了类转换异常,请管理员及时处理"); } // TODO 自动生成的方法存根 } }
3、异常中断机制
出现异常之后,异常之后的代码将会自动屏蔽掉;
package 异常; public class yichangzhongduanjizhi { public static void main(String[] args) { try { for(int i=0;i<5;i++) { System.out.println("输出第"+i+"行"); int a=1/i; }}catch(Exception e) { e.printStackTrace(); }//for循环在里面 for(int i=0;i<5;i++) { try { System.out.println("输出第"+i+"行"); int a=1/i; }catch(Exception e) { e.printStackTrace(); }//for循环在外面 }//Shift+Alt+z:自动添加异常 try { for(int i=0;i<5;i++) { int a=1/i; System.out.println("输出第"+i+"行"); }}catch(Exception e) { e.printStackTrace(); }//Shift+Alt+z:自动添加异常//将int a=1/i提前 } // TODO 自动生成的方法存根 }
4、恢复机制(finally代码块)
语法:(相当于加上了一层保险)
try{ //被捕获的代码 } catch(异常类型e){ //对异常的处理 }finally{ //最后一定会执行的代码 }
四种特殊情况finally代码块不会运行:
- finally块中发生异常;
- 在前面的代买中使用了System.exit();//强行停止;
- 程序所在线程死亡;
- cpu关闭
三、java常见异常
ClassNotFoundException // 未找到相应类异常
ClassCastException // 类型转换异常
ArithmeticException // 算术异常
ArrayIndexOutOfBoundsException // 数组下标越界异常
SQLException // 操作数据库异常类
IOException // 输入输出异常
FileNotFoundException // 文件未找到异常
IllegalAccessException // 不允许访问某类异常
NullPointerException // 空指针异常
四、自定义异常
1.创建自定义异常
(创建一个API中没有的异常)
语法:class 自定义异常类 extends 已有的异常类{ }
2、使用throws关键字抛出异常
语法:public void method()throws异常类型1,异常类型2,异常类型3 { }
被调用时:
try{ method() } catch(异常类型e){ e.printStackTrace(); }
3、使用throw关键字抛出异常
(手动制造一个异常)
语法:throw new 异常类型();
五、异常使用原则
- 不要忽略捕捉到的异常
- 不要过度使用异常
- 不要使用过于庞大的try-catch
- 子类抛出的异常不能比父类更高级