异常:是指阻止当前方法或者作用域继续执行的问题 ——《Think in Java》
当程序出现了异常,方法终止执行,我们需要去处理这个异常以使程序正常运行
Java中的异常处理机制,其实就是当代码出现逻辑错误时,尽可能的返回出错信息,帮助我们定位出错位置
异常体系结构
Throwable
是整个异常处理机制的最高父类,它有两个子类 Error
和 Exception
Error:程序无法处理的严重错误,我们不作处理
- 这种错误一般来说与操作者无关,并且开发者与应用程序没有能力去解决这一问题,通常情况下,JVM会做出终止线程的动作
Exception:异常可以分为运行时异常和编译时异常(非运行时异常)
-
RuntimeException:编译时通过,运行时出错
-
OtherException:在编译期间,编译器检测到某段代码可能会发生某些问题,需要程序员提前给代码做出错误的解决方案。否则编译是不能通过的
此时FileReader中出现的报错就是编译时异常,我们需要提前对可能出现的异常进行处理
以下代码会出现运行时异常,编译期间正常,运行代码出现报错
int arr[]={1,2,3};
System.out.println(arr[4]);
处理异常方式
Java对异常的默认处理方式: 将问题抛出给上一级
当出现异常的时候 Java会根据问题的异常类 创建一个实例对象 然后将该对象抛给上一级
public static void main(String[] args) {
method();
}
public static void method(){
System.out.println(10/0);
}
运行代码出现以下报错信息
当执行到method里面的方法时,出现异常的运算条件,创建出ArithmeticException对象,抛给调用这个方法的上一级也就是method方法,method方法里面没有处理异常,接着将异常抛给上一级也就是main方法,接着抛给jvm,jvm拿到问题之后,打印错误的位置和原因。
-
问题可以自己处理:try catch处理 不会影响后续代码的执行
-
问题不能自己处理:throws抛出处理
try catch:
int arr[]={1,2,3};
System.out.println(arr[4]);
System.out.println("后续代码执行......");
代码遇到异常之后不会执行后续代码,直接报错
try {
int arr[]={1,2,3};
System.out.println(arr[4]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组越界");
}
System.out.println("后续代码执行......");
使用try catch处理代码 后续代码正常执行
throws:
//定义people类 属性:age及其set get方法
People p = new People();
p.setAge(-20);
System.out.println(p.getAge());
年龄为-20明显是不合理的 改造一下set方法
public void setAge(int age) {
if(age>=0){
this.age = age;
}
else {
System.out.println("年龄有误");
}
}
get方法获取的数据为默认值 0 ,出现的默认值 0 也是不合理的
假设people是我们编写的,其他人调用people,调用者输入年龄为负数,这不是我们自己可以控制的,这时候就需要抛出异常
throw
将异常对象抛给调用者
throws
告知调用者此方法存在异常 对方法进行声明
public void setAge(int age) throws Exception {
if(age>=0){
this.age = age;
}
else {
throw new Exception("年龄有误");
}
}
此外我们还可以自定义异常类,只需要继承Exception类即可