一.异常
1.概念
代表程序出现的问题
2.体系
Error:代表系统级别错误(属于严重问题)
系统一旦出现问题,sum公司会把这些封装成Error对象。
Exception:叫作异常,代表程序可能出现的问题,我们通常会用Exception以及他的子类来封装程序出现的问题。
运行时异常:RuntimeException及他的子类 ,编译阶段不会出现异常提醒,运行时出现的异常,一般都是由于参数传递错误带来的问题。(如:数组索引越界异常)
编译时异常:编译阶段就会出现异常提醒的,没有继承RuntimeException,直接继承Exceotion,必须手动处理,否则代码报错,除了RuntimeException及子类,其他都是编译时异常。(如:日期解析异常)
3.作用
- 异常是用来查询bug的关键参考信息
- 异常可以作为方法内部的一种特殊的返回值。以便通知调用者底层的执行情况
//第二个作用的示例
public void setAge(int age){
if( age < 18 || age > 40)
throw new RuntimeExpection();
}else{
this.age = age;
}
}
二.异常的处理方式
1.JVM默认的处理方式
- 把异常的名称,异常原因及异常出现的位置等信息输出在控制台。
- 程序停止执行,异常下面的代码不会再执行了。
2.捕获异常
自己处理,不让程序停止,多写在方法调用处。
2.1格式
try{
可能出现异常的代码
}catch(异常类名 变量名){
异常处理的代码;
}finally(一定会执行的代码
}
int[] arr = {1,2,3,4}
try{
System.out.println(arr[10]);
}catch(ArrayIndexOutofBoundException e){
System.out.println("索引越界了");
}finally{
System.out.println("一定被执行");
}
System.out.println("有没有执行");
解释说明:
- 当可能出现异常代码的地方出现了异常,程序就会在那创建一个ArrayIndexOutofBoundsException对象:new ArrayIndexOutofBoundsException()。
- 拿着这个对象到catch中的小括号中对比,看括号中的变量是否可以接受这个对象。
- 如果能被接收,就表示该异常被捕获(抓住),执行catch里面对应的代码。
- 当catch里面所有代码执行完毕,继续执行try……catch体系下面的其他代码。
- 被finall控制的语句一定会执行,除非JVM退出。
- finally可写可不写
接口:AutoCloseable(JDK7后推出的)
特点:在特定的情况下,可以自动释放资源
注:只有实现了AutoCloseable接口的类才能在小括号中创建对象
- 基本做法
//手动释放资源
try{
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}finally{
执行所有资源释放操作;
}
- JDK7方案
//资源用完最终自动释放
try(创建流对象1;创建流对象2;){
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}
- JDK9方案
//资源用完最终自动释放
创建流对象1;
创建流对象2;
try(流1:流2){
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}
2.2.try……catch可能遇到的四个问题
- try中没有遇到问题时
会把try里面所有的代码全部执行完毕,catch里面的代码不会执行。
- try中遇到了多个问题时
写多个catch与之对应。
注:
- 如果我们要捕获多个异常,这些异常中如果存在父子关系的话,那么父类一定要写在下 面,避免出现有问题捕获不到的现象(原因:多态)。
- 在JDK7之后,如果多个异常的处理方式是一样的,可以在catch中捕获多个异常,中间用 | 隔开
- try中遇到的问题没有被捕获
书写的try……catch无作用,最后交给虚拟机处理。
- try中遇到了问题
try下面的其他代码不会执行,会直接跳到对应的catch当中,没有匹配的catch,会交给虚拟机处理。
2.3.Throwable的成员方法
方法名称 | 说明 |
public String getMessage() | 返回此throwable的详细消息字符 |
public String toString() | 返回此可能抛出的简短描述 |
public void printStackTrace() | 把异常的错误信息输出在控制台 |
注:printStackTrace()方法仅仅只是打印信息,程序不会停止运行,下面的代码还是会执行。
3.抛出异常
3.1throws
概述:写在方法定义处,表示声明一个异常,告诉调用者,使用本方法可能会有哪些异常。
//格式
Public void 方法() throws 异常类名1,异常类名2……{}
注:
- 编译时异常(代码错误),必须要写
- 运行时异常(参数错误),可以不写
3.2throw
- 写在方法内,结束方法。
- 手动抛出异常对象,交给调用者。
- 方法中下面的代码不再执行。
//格式
public void 方法(){
throw new NullPointException();
}
三.自定义异常
1.步骤
- 定义异常类
- 写继承关系
- 空参构造
- 有参构造
2.意义
为了让控制台的报错信息更加见名知意。
3.示例
public class NameFormatException extends RuntimeException{
public NameFormatException() {};
public NameFormatException(String message){
super(message);
}
}
命名技巧
- NameFoemat当前异常名字,表示名字格式化问题,见名知意。
- Exception表示当前异常类型。
注:
- 运行时(RuntimeException)一般来说是表示由于参数错误而导致的问题。
- 编译时(Exception)提醒程序员检查本地信息。