Java中异常也是以类,对象的形式存在
异常父类Throwable
①Error错误
②Exception异常
***
**面试题:Error和Exception的区别**
Error指的是比较严重错误,该错误无法通过代码调试挽回
Exception指的是程序运行期间不应该出现的错误,通常称为BUG,可以通过代码修改避免异常
***
### Exception异常
异常的继承树
![](https://box.kancloud.cn/93d5b21f222df34938dfbf7925179d51_651x446.png)
①检查性异常
编译器会自动检查,自动提示报错
②非检查性异常
编译器不会自动检查(例如:数组越界,空指针等),都是因为思维不缜密或没有按照编码规范书写造成的,这种情况应该由程序员自行避免。
***
### 处理异常的两种方式
①自行处理
~~~
public class ExceptionDemo1 {
public void test() {
// 将参数代表的类加载到JVM内存里
// 处理异常的两种方式
// 1.自行处理try..catch..finally
// try块:将有抛出异常风险的代码写到try块当中--相当于体检中心
// try块不能单独存在,绝大多数情况下,与catch配合--相当于医生
// catch块可以存在多个,catch块参数是捕获的异常信息类型
// 思考:finally--书写一定要执行的代码:关闭流,回收资源
try {
Class.forName("com.neuedu.chapter8_0426_1.ExceptionDemo1");
int arr[] = {1,2,3};
System.out.println(arr[11]);
System.out.println(1111);
return;
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println(123);
}
}
public static void main(String[] args) {
// 数组越界
// int arr[] = {1,2,3};
// System.out.println(arr[13]);
// 空指针
ExceptionDemo1 ed = new ExceptionDemo1();
// ed = null;
ed.test();
}
}
~~~
②向上抛出
~~~
public class ExceptionDemo2 {
public void test() throws ClassNotFoundException,Exception{
// 2.向上抛出(规避异常)
Class.forName("com.neuedu.chapter8_0426_1.ExceptionDemo1");
}
public static void main(String[] args) {
ExceptionDemo2 ed = new ExceptionDemo2();
try {
ed.test();
} catch (Exception e) {
e.printStackTrace();
}
}
}
~~~
***
### 主动抛出异常throw
~~~
public class PersonTest {
public static void main(String[] args) {
Person p = new Person();
p.head = 9;
p.arms = 1;
// 主动触发throw
if(p.head != 1 || p.arms != 2) {
try {
throw new WrongHeadOrArmsException();
} catch (WrongHeadOrArmsException e) {
e.printStackTrace();
}
}
}
}
~~~
### 自定义异常
~~~
public class WrongHeadOrArmsException extends Exception{
}
~~~