代码运行期间出现问题阻止当前方法或作用域的情况就是异常
Java就将一些异常信息封装为一个类
当出现异常时,就会创建异常对象并抛出异常的信息
Throwable
Java中的所有异常类都继承于Throwable类。
Throwable主要包括两个大类,一个是Error类,另一个是Exception类;
Error比Exception更严重,不易通过后续代码处理和修复
Error类
Error包括虚拟机错误和线程死锁
Error类:程序在运行期间发生的某种错误,没有具体的处理方式
Error一般是系统级别的问题,我们无法处理,只能修正代码
Exception类
Exception类:在编译器或运行期出现异常,我们对异常进行处理,程序就可以继续运行
Exception主要包括两大类,非检查异常/运行时异常(RuntimeException)
检查异常(其他的一些异常)
异常的关键字throw
抛出异常:在方法中 throw new 异常对象,必须是Exception或其子类
在方法头 throws 异常类名
throws表示出现异常的一种可能性,并不一定会发生这些异常;
throw抛出了异常,则一定抛出了某种异常对象
异常调用原则:如果该功能内部可以处理就用try,处理不了就用throws
异常的处理:
try{
可能出现异常的代码
}catch(异常类名 变量名 ){
异常的处理
}finally{
必须执行的代码
}
catch可以有多个,finally可以没有
多个catch块处理的异常类,要按照先catch子类异常后catch父类异常的处理方式
只会执行一个catch语句块,能明确异常名的尽量明确,不能明确用Exception
不管有没有出现异常或者try...catch中有return,finally块中代码都会执行
finally中最好不要包含return,否则程序会提前退出
注意:try里面的代码越少越好,它会占用JVM的资源
return值为-1为抛出异常的习惯写法
方法:
public String getMessage():异常的消息字符串
public String toString():返回异常的简单信息描述-->
此对象的类的name(全路径名) +
“: ”(冒号和1个空格) +
调用此对象getLocalizedMessage()方法的结果
(默认返回getMessage()的内容)
public void printStackTrace():获取异常类名和异常信息,
以及异常信息在程序中出现的位置,
返回值void,把信息输出在控制台
非检查异常
RuntimeException与其子类
在程序运行期间出现的异常导致程序意外终止
System.exit(0);正常结束程序,终止当前正在运行的虚拟机
System.exit(1);异常结束程序
调用 System.exit(n) 实际上等效于调用:
Runtime.getRuntime().exit(n)
public static void main(String[] args) {
try {
get(null);
} catch (Exception e) {
System.out.println(e);
} finally {
System.out.println("发不发生异常都会执行");
}
}
public static void get(String s) {
if (s == null) {
throw new NullPointerException("对象不存在");
}
}
对于运行时异常,方法上无需throws,调用者也无需处理
运行期异常一旦发生,程序就会终止,需要程序员修改源代码
子类继承父类时,不能抛出比父类更大的异常(继承关系上)
如果父类抛出多个异常,子类不能抛出父类没有的异常
父类方法没有抛出异常,子类重写后也不能抛出异常;
如果有异常发生,只能try...catch捕获这个异常
检查异常
除了Error,RuntimeException及其子类以外,
其他的Exception类及其子类都属于可查异常。
程序编译期间出现的异常
这种异常的特点是Java编译器会检查它,
必须处理,你不会处理,编译就无法通过
自定义异常
public class TooSmallException extends RuntimeException {
public TooSmallException() {
super();
}
public TooSmallException(String message) {
super(message);
}
}
public static void main(String[] args) {
try {
get(1);
} catch (TooSmallException e) {
System.out.println(e);
}
}
public static void get(int i) {
if (i < 100) {
throw new TooSmallException("数值过小异常");
}
}