一、异常的体系结构
java.lang.Throwable
1.Error: 错误 程序不进行处理
2.Exception: 异常 在程序开发时,要对这些异常进行处理
①.编译时异常 :在编译期间出现的异常
②.运行时异常 :在运行期间出现的异常
当执行一个程序时,如果出现异常,那么异常之后的代码就不会执行。
二、如何处理Exception异常
处理异常的方式:抓抛模型
1.抛:当执行程序时,一旦出现异常,就会生成一个对应异常类型的对,并将对象抛出
①.抛的类型:自动抛和手动抛
②.此异常的对象将来是交给方法的调用者
2.抓:抓住程序中跑出来的异常对象。
异常处理的方式:
1.try-catch-finally
try{
// 可能会发生异常的代码
}catch(Exception e1){
// 处理方式一
}catch(Exceptio e2){
// 处理方式二
}finally{
// 一定要执行的代码
}
①.try代码块里面的声明的变量,是局部变量,作用域是在代码块中
②.finally是可选的,如果加了finally,不论是否出现异常,都会执行finally中的代码
③.catch语句是用来处理异常
getMessage(); printStrackTrace():打印异常信息(程序出错的位置信息及原因)
④.catch代码块可以有多个,try中抛出的异常对象是从上往下去匹配catch中的异常类型,一旦满足就执行catch中的代码。执行完毕就跳出所有的catch。
⑤.如果catch中多个异常类型是并列关系,不需要考虑顺序问题。
如果catch中多个异常类型有继承关系,子类需要在父类异常对象的上面,否则会出现编译错误
⑥.try-catch是可以嵌套多层。
提示:
1.对于运行时异常,可以不用显示的进行异常处理。
2.对于编译时异常,必须要显示的进行异常处理。
// 常见的异常
// 1.数组下表越界的异常ArrayIndexOutOfBoundsException
@Test
public void test2() {
try {
int[] numbers = new int[5];
System.out.println(numbers[5]);
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
}
// 2.算术异常 ArithmeticException
@Test
public void test3() {
try {
int i = 10;
System.out.println(i / 0);
} catch (ArithmeticException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 3.类型转换异常ClassCastExceptio
@Test
public void test4() {
try {
Object date = new Date();
String string = (String) date;
} catch (ClassCastException e) {
System.out.println(e.getMessage());
} catch (NullPointerException e) {
// TODO: handle exception
}
}
// 4.空指针异常 NullPointerException
@Test
public void test5(){
try{
String[] names=null;
System.out.println(names[0]);
}catch(NullPointerException e){
e.printStackTrace();
}
}
// 5.编译时异常
@Test
public void test6(){
FileInputStream fs = null;
try {
fs = new FileInputStream(new File("hello.txt"));
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} finally {
try {
fs.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}