异常的学习
异常分为编译时期异常与运行时期异常
编译时期异常运行前必须处理,否则代码报错
除了RuntimeException和他的子类,其他都是编译时异常
运行时期异常运行时报错,一般是由参数传递错误导致的报错
异常的作用:
1.异常使用来查询bug的关键参考信息
2.异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
异常的处理方法
1.虚拟机默认的处理方式
把异常的名称,原因,出现位置输出在控制台,并停止进程
2.自己处理(捕获异常)
格式:
try{
可能出现的异常的代码;
} catch(异常类名 变量名){
异常的处理代码;
}
目的:代码出现异常时,可以继续运行
int[] arr = {1, 2, 3, 4, 5};try {//可能出现异常的代码System.out.println(arr[10]);//此处出现了异常。就会在这里创建一个 ArrayIndexOutOfBoundsException对象//new ArrayIndexOutOfBoundsException()//拿着这个对象到catch里面的小括号里比,哭哭小括号中的变量是否可以接收//如果能接收,就表示该异常被捕获,执行catch里的代码//执行完毕后继续执行try catch体系下面的代码 } catch (ArrayIndexOutOfBoundsException e) {//如果出现了异常该如何处理System.out.println("索引越界了"); } System.out.println("?????????");
如果try中可能会遇见多个问题,怎么执行?
碰到第一个异常就会跳转到catch,不会运行try接下来的语句
如果会有多个异常,就应该有多个catch接受
如果这些异常存在父子关系的话,父类一定要写在下面
3.交给调用者
异常类常用的方法
Throwable的成员方法
//获取异常信息 /* String message = e.getMessage();System.out.println(message);*//* //打印异常String s = e.toString();System.out.println(s);*///打印异常,仅仅是打印信息,不会停止程序运行e.printStackTrace();
抛出处理
throws
注意:写在方法定义出,表示声明一个异常,告诉调用者,使用本方法可能会有哪些异常
public void 方法() throws 异常1,异常2.。。{
}
编译时异常:必须要写
运行时异常:可以不写
public static void main(String[] args) {/** throws* */int[] arr = {};try {System.out.println(getMax(arr));} catch (NullPointerException e) {System.out.println("空指针");} catch (ArrayIndexOutOfBoundsException e) {System.out.println("索引越界");}System.out.println("????");}public static int getMax(int[] arr) throws NullPointerException, ArrayIndexOutOfBoundsException {if (arr == null) {//手动创建一个异常对象,并把这个异常交给调用者处理throw new NullPointerException();}if (arr.length == 0) {throw new ArrayIndexOutOfBoundsException();}int max = arr[0];for (int i = 0; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}return max;} }
throw
注意:写在方法内,结束方法,手动抛出异常对象,交给调用者,方法中下面的代码不再执行了
public void 方法(){
throw new 异常();
}
自定义异常
1.定义异常类
2.写继承关系
3.写空参构造
4.带参构造
public class NameFormatException extends RuntimeException{//技巧//NameFormat当前异常名字//Exception表示当前是个异常类//运行时异常RuntimeEcxeption 核心 参数错误导致的问题//编译时异常Exception 核心 提醒程序员检查本地信息public NameFormatException() {}public NameFormatException(String message) {super(message);} }
public void setName(String name) {int len = name.length();if (len < 3 || len > 10) {throw new NameFormatException(name+" 格式有误!");}this.name = name; }