异常
- Throwsble:总父类
- Error:错误
- 无法提前避免和解决
- 通常由设备或内存问题导致
- Exception:异常
- 可以提前避免或解决
- 通常由代码导致
- RuntimeException:运行异常,也称未检查异常,未检异常等
- 编译不报错,运行出错
- 可以选择性的处理
- java.lang.ArrayIndexOutOfBoundsException:数组下标越界
- java.lang.StringIndexOutOfBoundsException:字符串下标越界异常
- java.lang.IndexOutOfBoundsException:下标越界异常
- java.lang.NullPointerException:空指针异常
- java.lang.ClassCastException:类型转换异常
- java.lang.NumberFormatException:数据类型转换异常
- java.lang.Arithm eticException:数学运算异常
- …
- 运行时异常都属于java.lang包
- 非运行时异常:也称已检查异常,已检异常等
- 编译就会报错
- 必须作出处理
- 只要不是运行时异常。则一定是非运行时异常
异常的产生
- 自然产生:编译或执行到有问题的代码时,会自动产生异常
- 手动产生:
throw 异常对象;
- 位置:方法内部
- 执行:当执行或编译到该语句时,会抛出一个异常,程序终止
- 该语句同一直属作用范围内,下方不可存在其他有效语句
原因:无法执行
- 该语句同一直属作用范围内,下方不可存在其他有效语句
可以使程序停止运行
- 代码运行完毕
- 执行到异常
3.在非递归的情况下运行到return;
public class Test2 {
public static void main(String[] args) {
System.out.println("main开始");
ma();
System.out.println("main结束");
}
public static void ma(){
System.out.println("ma开始");
//手动抛出异常
throw new RuntimeException();
//System.out.println("ma结束");
}
}
异常处理:消极处理
- 上抛异常,消极处理
访问修饰符 返回值类型 方法名()throws 异常类名1,异常类名2,..{
}
- 特点:方法自身不处理异常,讲异常上抛给调用者,该解决方式无法根治问题,如果异常最终上抛至虚拟机,则程序任然强制终止
- 使用
- 上抛父类异常可以解决处理内部的子类异常
- 调用者需要处理的异常类型由throws声明决定
throw和throws的区别:
- 位置:throw写在方法内部,throws写在方法声明处
- 作用:throw是抛出制造异常,throws是上抛解决异常
public static void main(String[] args)throws Exception {
System.out.println("main开始");
mb();//Exception
System.out.println("main结束");
}
public static void mb()throws Exception{
//抛出一个非运行时异常
throw new ActivationException();
}
- try-catch:积极处理
try{
//有可能出现异常的代码
}catch(有可能匹配的异常类型 引用名){
//处理代码
}
- 特点:将有可能出现异常的代码放入try中,当发生异常时,如果有对应的catch块解决异常,则异常被消化,程序可以继续向下执行
- 使用:
1. 若catch匹配不成功,则程序仍然终止
2. catch 块可以存多个
3. 父类异常可以匹配子类异常
4. 为了保证try-catch结构一定执行成功,通常会在最下方catch一个Exception
5. 父类catch块必须写在子类catch块下方- 原因:catch块自上而下匹配且最多执行一个,父类catch块写在上方会导致子类catch块无效
finally
通常结合try-catch块使用,用于关于释放资源
try{
}catch(){
}finally{
}
- 写在try-catch结构最下方
使用
- 不受try-catch影响,无论如何都会执行
- 可以和try单独使用,表示try中代码无论执行结果怎么样finally中都会执行
- 不可以和catch单独结合
- 不可以独立存在
- 当try-catch-finally出现rryurn 语句冲突时优先执行finally
方法补充:
为了方便查看和处理异常,Throwable中提供了对应方法:
- String getMessage():获取异常的详细信息
- void printStackTrace():输出异常的追栈信息(异常类型、详细信息、触发位置)
try {
System.out.println(10 / 0);
} catch (Exception e) {
System.out.println("未知异常!");
System.out.println("详细信息:" + e.getMessage());
System.out.println("追栈信息:");
e.printStackTrace();
}
自定义异常
-
运行时:继承RuntimeException,提供无参有参构造(调用父类有参构造给Throwable中的详细信息属性赋值即可)
/** * 运行时异常 */ public class MyRuntimeException extends RuntimeException { public MyRuntimeException(){ } public MyRuntimeException(String message) { super(message); } }
-
非运行时异常:继承Exception,提供有参无参构造
/** * 非运行时异常 */ public class MyException extends Exception { public MyException(){ } public MyException(String message) { super(message); } }