异常的体系结构
java.lang.Throwable
--Error:错误,程序中不进行处理
--Exception:异常,要求在编写程序时,就要考虑对这些异常进行处理
--编译时异常(RuntimeException之外的):在编译期间出现的异常(运行javac命令时,出现的异常)
--运行时异常(RuntimeException):在运行期间出现的异常(运行java命令时,出现的异常)
当执行一个程序时出现异常,异常之后的代码将不会再执行
常见的运行时异常
1.数组下标越界的异常 ArrayIndexOutBoundsException
public void test2(){ int[] i=new int[10]; System.out.println(i[10]); }
2.算术异常 ArithmeticException
public void test3(){ int i=10; System.out.println(i/0); }
3.类型转换异常 ClassCastException
public void test4(){ Object obj=new Date(); String str=(String) obj; }
4.空指针异常 NullPointerException
public void test5(){ String[] names=null; System.out.println(names[0]); String str=new String("jack"); System.out.println(str.length()); }
如何处理异常
Java提供的异常处理的抓抛模型
1、抛:当执行代码时,一旦出现异常,就会在出现异常的代码处生成一个对应的异常对象,并将次异常对象抛出(自动抛出和手动抛出)
一旦抛出异常对象,接下来的代码将终止运行。此异常对象将抛给方法的调用者。
2、抓:抓住上一步抛出的异常对象。(异常处理方式)
Java提供了两种异常处理方式
异常处理方式一:
try{
可能出现异常的代码
}catch(Exception e){
处理方式
}finally{
一定要执行的语句块
}
注:
1、try内声明的变量相当于局部变量,除了try语句块即失效
2、finally语句块是可选项可加可不加
3、一个try可以配有多个catch语句块。catch中如果多个异常是并行关系不分先后顺序;如果catch中异常存在父子关系,子类一定要写在父类的上面,否则会报错;
4、当try中出现异常时,该异常会从上往下顺序与catch的异常类型进行匹配,匹配成功后执行该catch块后,跳过后面的catch直接执行finally语句块
5、finally语句块一定会被执行
*运行时异常可以不进行显式的处理,但编译时异常必须进行显式的处理
异常处理方式二:
在方法的声明处显式的抛出该异常的类型
语法:public static void method() throws FileNotFoundException,IOException
在此方法内部出现异常时,会抛出一个异常对象给方法的调用者,由方法的调用者进行处理,异常可以逐级向上抛