程序执行过程中不正常的情况
分类
-
Throwable:总父类
-
Error:错误
-
无法提前避免和解决
-
通常由硬件设备或内存问题导致
-
-
Exception:异常
-
可以提前避免或解决
-
通常由代码导致
-
RuntimeException:运行时异常,也称为未检查异常、未检异常等
-
编译不报错,运行出错
-
可以选择性的处理
-
java.lang.NullPointerException:空指针异常
-
java.lang.IndexOutOfBoundsException:下标越界异常
-
java.lang.NumberFormatException:数据类型转换异常
-
java.lang.ClassCastException:类型转换异常
-
java.lang.ArithmeticException:数学运算异常
-
...
-
运行时异常都属于java.lang包
-
-
非运行时异常:也称为已检查异常、已检异常等
-
编译就会报错
-
必须做出处理
-
只要不是运行时异常,则一定是非运行时异常
-
-
异常的产生
-
自然产生: 编译或执行到有问题的代码时,会自动产生异常
-
手动产生:
throw 异常对象;
-
位置:方法内部
-
执行:当执行或编译到该语句时,会抛出一个异常,程序终止
-
该语句同一直属作用范围内,下方不可存在其他有效语句
-
原因:无法执行
-
-
可以使程序停止执行:
代码运行完毕
执行到异常
在非递归的情况下运行到
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声明决定
-
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块解决异常,则异常被消化,程序可以继续向下执行
-
使用:
-
若catch匹配都不成功,则程序仍然终止
-
catch块可以存在多个
-
父类异常可以匹配子类异常
-
为了保证try-catch结构一定执行成功,通常会在最下方catch一个Exception
-
父类catch块必须写在子类catch块的下方
-
原因:catch块自上而下匹配且最多执行一个,父类catch块写在上方会导致子类catch块无效
-
-
-
finally块
通常结合try-catch块使用,用于关闭释放资源
try{ }catch(){ }finally{ }
-
写在try-catch结构的最下方
使用
-
不受try-catch影响,无论如何都会执行
-
可以和try单独结合使用,表示try中代码无论执行结果怎样finally中都会运行
-
不可以和catch单独结合
-
不可以独立存在
-
当try-catch-finally中出现return语句冲突时,优先执行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); } }
今日掌握
-
异常的分类
-
throw和throws的区别
-
作用:throw是抛出制造异常,throws是上抛解决异常
-
位置:throw是写在方法内部,throws是写在方法声明处
-
-
try-catch-finally的使用