异常分为编译时期异常与运行时期异常
编译时期异常运行前必须处理,否则代码报错
除了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; }