Java 异常
Throwable
Error错误 Exception异常
RuntimeException
异常 处理掉 程序可以继续执行
错误 不修改 程序无法执行 例如 java.lang.OutOfMemoryError: Java heap space

异常的关键字
throw 在方法内部 抛出异常的对象
throw 后面 必须写new 对象 ,且此对象必须是 Throwable的子类Exception的对象或Exception子类的对象 总之必须是可以被抛出的对象 不可是常见的普通类对象
throws 用于方法的声明上 表明此方法 可能出现异常 请调用者处理 不处理 则编译失败!
调用者对异常的处理 有两种选择
1. 继续向上一级抛出,由上级处理
2.自己内部 try catch 处理掉
try{
}catch( 异常类类名 变量){
循环 判断 调用其他方法 变量运算
}finally{
无论是否异常发生 都必须被执行的代码
常见应用 资源的释放
}

多catch写一起
catch后的小括号中可以写多个异常类的类名,
这些类名 彼此有顺序概念存在
平级之间的类 顺序无所谓前后 平级的异常类 异常类没有继承关系
上下级关系的类 越高级的父类 越要写在下面! 【多态调用 catch捕获到的异常类对象 = 被调用方法抛出的new 异常类对象 父类 父类引用 = new 子类 对象】

RuntimeException 与 Exception异常存在处理上的差异
方法中 存在 RuntimeException 运行时异常 时,该方法的声明 无需 throws RuntimeException ,因为这种运行时异常 是必须手动修改代码的 异常发生后的代码都是无意义的代码
由于方法声明中无需 throws 因此 调用方法的方法中也不需要 try catch
在执行方法期间抛出但未捕获的RuntimeException的任何子类都无需再throws子句中进行声明

编译异常 调用了抛出异常的方法 不处理编译失败 必须 try catch
运行异常 抛出的异常是RuntimeException类或它的子类
运行异常的特点:
方法内部抛出的异常是运行异常 newXXXException
方法声明上 不需要throws语句 调用者 不需要处理
设计原因 运行异常 不能发生 如果发生 程序员需要修改程序源代码
一旦发生 已不需异常处理 只能代码级修改~
int[] arr = {1,2,3}; //if判断 运行时 JVM抛出运行时异常的子类异常 ArrayIndexOutOfBoundsException if(arr[5]>5){ int i = arr[5]+1; //运行时异常 后续的代码都没有存在的意义 }
String s = null; boolean b = s.endsWith("#"); // 运行时 JVM抛出运行时异常的子类异常 NullPointerException
private static void function1() { int avg = avgNumber(1,4,6,2,-3,7); System.out.println("平均数:"+avg); } private static int avgNumber(int...source){ int sum = 0; for(int s: source){ if(s < 0){ throw new RuntimeException("传入的参数 存在负数"); } sum = sum+s; } return sum/source.length; }
父类的方法 如果抛出异常 子类重写父类方法时
子类方法可以抛出异常 但此异常不能大于父类异常(异常的上下级关系)
子类方法 也可以 不抛出异常!
假设 子类继承了父类 重写了父类某方法
父类中该方法没有异常
那么 子类中被重写的该方法 必然没不能在方法声明中 throws 异常类名
但 该方法中若恰好掉用了其它方法 而被调用方法会抛出异常,则 子类别无选择 因其不能 throws 向外抛出 就只能在自身内部 try catch 处理掉被调用方法抛出的异常
Throwable类中的与异常类信息有关的三个方法
String getMessage() //异常信息的详细描述
String toString() //异常信息的剪短描述
void printStackTrace() //将异常信息追踪到标准的错误流 异常信息最全 JVM默认使用了此方法!

自定义异常类 必须继承 Exception或 RuntimeException 且 要写好自定义类的 构造方法
public class FuShuException extends RuntimeException{ public FuShuException() { } public FuShuException(String message) { super(message); } }
public class TestException { public static void main(String[] args) { try { function1(); } catch (FuShuException e) { System.out.println(e.getMessage()); e.printStackTrace(); } } private static void function1() { int avg = avgNumber(1,4,6,2,-3,7); System.out.println("平均数:"+avg); } private static int avgNumber(int...source){ int sum = 0; for(int s: source){ if(s < 0){ throw new FuShuException("传入的参数 存在负数"); } sum = sum+s; } return sum/source.length; } }

浙公网安备 33010602011771号