目录
异常体系
异常是什么?
程序中可能出现的问题
异常体系的最上层父类是谁?异常分为几类?
父类:Exception
异常分为两类:编译时异常、运行时异常
编译时异常和运行时异常的区别?
编译时异常:没有继承RuntimeExcpetion的异常,直接继承于Excpetion。在编译阶段就会提示错误;
运行时异常:RuntimeException本身及其子类。编译阶段没有错误提示,运行时才出现错误提示。
代码示例
public static void main(String[] args) {
//编译时异常(在编译阶段,必须要手动处理,否则代码报错,无法运行)
String time ="2030年1月1日";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
Date date = sdf.parse(time);
System.out.println(date);
//运行时异常(在编译阶段是不需要处理的,是代码运行时出现的异常)
int[] arr ={1,2,3,4,5};
System.out.println(arr[10]);//ArrayIndexOutofBoundsException
}
异常的作用
作用一:通过异常提示可以查询bug的关键参考信息
作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
异常的处理方式
JVM默认的处理方式
将异常的名称,异常原因及异常出现的位置等信息输出在控制台中,程序停止执行,异常出现位置下面的代码不会再执行。
自己处理(捕获异常)
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6};
try {
System.out.println(arr[10]);
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("索引越界了");
}
System.out.println("看看我执行了吗?");
}
分类讨论异常捕获情况
1. 如果try中没有遇到问题,怎么执行?
会把try里面所有的代码全部执行完毕,不会执行catch里面的代码。
注意:只有当出现了异常才会执行catch里面的代码 。
2. 如果try中可能会遇到多个问题,怎么执行?
会写多个catch与之对应。
注意:如果我们要捕获多个异常,这些异常中如果存在父子关系的话,那么父类一定要写在下面
了解:在JDK7之后,我们可以在catch中同时捕获多个异常,中间需要用分隔符" | "进行隔开表示,如果出现了A异常或者B异常的话,采取同一种处理方案
3. 如果try中遇到的问题没有被捕获,会怎么执行?
相当于try...catch白写了,当前异常会交给虚拟机处理
4. 如果try中遇到了问题,那么try下面的其他代码还会执行吗?
如果try中遇到了问题,则出现问题处下方的代码不会再执行,会直接跳转到对应的catch当中,执行catch中的语句。如果没有对应catch与之匹配,则会交给虚拟机进行处理
异常中的常见方法
public String getMessage() //返回此 throwable 的详细消息字符串
public string toString() //返回此可抛出的简短描述
//把异常的错误信息输出在控制台,同时包含getMessage和toString两个方法的信息,并且只做打印,不会停止代码运行
public void printStackTrace()
代码示例
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6};
try {
System.out.println(arr[10]);
}catch (ArrayIndexOutOfBoundsException e){
String message1 = e.getMessage();
String message2 = e.toString();
System.out.println(message1);
System.out.println(message2);
e.printStackTrace();
}
System.out.println("看看我执行了吗?");
}
抛出异常
代码示例
public static void main(String[] args) {
int[] arr = new int[0];
try {
int sum = getSum(arr);
System.out.println(sum);
} catch (NullPointerException e) {
System.out.println("空指针异常");
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("索引越界异常");
}
}
//运行时异常不需要手动声明
public static int getSum(int[] arr)/*throws NullPointerException,ArrayIndexOutOfBoundsException*/ {
if (arr == null)
throw new NullPointerException();
if (arr.length == 0)
throw new ArrayIndexOutOfBoundsException();
int sum = 0;
for (int i = 0; i < arr.length; i++)
sum += arr[i];
return sum;
}
总结
自定义异常
意义:为了让控制台的报错信息更加见名之意
步骤如下
1.定义异常类
2.写继承关系
3.空参构造
4.带参构造
注意
类命名技巧:异常类型+Exception
若该类为运行时异常则需继承:RuntimeException(表示由于参数错误而导致的问题)
若该类为编译时异常则需继承:Exception(提醒程序员检查本地信息)
代码示例如下
//自定义异常类
public class NameFormatException extends RuntimeException {
//类命名技巧:异常类型+Exception
//若该类为运行时异常则需继承:RuntimeException(表示由于参数错误而导致的问题)
//若该类为编译时异常则需继承:Exception(提醒程序员检查本地信息)
public NameFormatException() {
}
public NameFormatException(String message) {
super(message);
}
}