.1 异常介绍
异常就是代表程序出现的问题
分为编译时期和运行时期的异常
Error 代表系统级别错误,不用管
Exception 异常 代表程序可能出现的问题
运行时异常 RuntimeException及其子类 如数组索引越界异常
由字节码文件通过Java命令时代码出错而导致的程序错误
编译时异常 编译阶段出现的异常 如日期解析类异常
Java文件通过Javac命令生成字节码文件时的异常来提醒程序员检查本地信息
作用 :
异常是用来查询bug的关键参考信息
异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
.2 异常处理方法
.2.1 JVM默认的处理方式
把异常的的名称,异常原因及异常出现位置等信息输出在控制台
程序停止执行,下面的代码不会再执行了
public static void first(){
System.out.println("01...");
System.out.println(2/0);
System.out.println("看看我在第一种方式里面执行了吗");
}
.2.2 自己处理(捕获异常)
try{
可能出现异常的代码
}catch (异常类型 e){异常的处理代码
}好处:
当代码出现异常时,可以让程序继续往下执行
如果try里面没有遇到问题会把try里面的代码执行完然后跳过catch,只有发生异常时才会执行对应异常类型的catch
try里面多个异常要写多个catch对应,如果有子父级关系,父级的异常一定到写在自己catch的下面
如果try-catch没有捕获到出现的异常,那么就会交给虚拟机进行默认处理方式
public static void second(){
int[] arr = {1,2,3,4,5,6,7,8};
try {
//肯出错的代码
System.out.println(arr[10]);//在这里出现了索引越界的异常,程序就会创建一个ArrayIndexOutOfBoundsException 对象
// new ArrayIndexOutOfBoundsException()
// 拿着这个对象到catch的小括号中对比,看括号中变量是否可以接收这个对象
//如果能被接收,就表示该异常被捕获了,执行catch里面对应的代码
//当catch里面所有的代码执行完毕 继续执行try catch之后的代码
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("索引越界了");
}
System.out.println("看看我在第二种方式里面执行了吗");
}
.3 Throwable的成员方法
方法名称 说明 public String getMessage() 返回throwable的详细消息字符串 public String toString() 返回此可抛出的简短描述 public void printStackTrace() 把异常的错误信息输出在控制台 printStackTrace()方法包括了getMessage()和toString()
public class ExceptionDemo2 {
public static void main(String[] args){
first();
second();
third();
}
public static void first(){
int[] arr = {1,2,34,5,6,7,8,9};
try{
System.out.println(arr[10]);
}catch (ArrayIndexOutOfBoundsException e){
String message = e.getMessage();
System.out.println(message);
System.out.println("-----------------------------------");
}
}
public static void second(){
int[] arr = {1,2,34,5,6,7,8,9};
try{
System.out.println(arr[10]);
}catch (ArrayIndexOutOfBoundsException e){
String string = e.toString();
System.out.println(string);
System.out.println("-----------------------------------");
}
}
public static void third(){
int[] arr = {1,2,34,5,6,7,8,9};
try{
System.out.println(arr[10]);
}catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace();//包含了上面两个方法的内容,且是红色字体打印。。
}
}
}
.3 抛出处理
throws 写在方法定义处,表示声明一个异常告诉调用者,使用本方法肯会有哪些异常
编译时的异常必须要写,运行时异常可以不写
public void 方法()throws 异常类名1....n{}
throw 写在方法内,结束方法手动抛出异常对象,交给调用者,方法中下面的代码不再执行
throw new NullPointerException();
.4 自定义异常类
为了让控制台的报错信息更加见名知意
方法:
定义异常类
写继承关系
空参构造
带参构造
//自定义异常类
public class NameFormatException extends RuntimeException{
//技巧:
// NameFormat: 当前异常的名字,表示姓名格式化问题
//Exception: 表示当前类是一个异常类
//运行时: RuntimeException 核心就表示由于参数错误而导致的问题
//编译时 Exception 核心 提醒程序员检查本地信息
public NameFormatException() {
}
public NameFormatException(String message) {
super(message);
}
}
public class ExceptionDemo4 {
public static void main(String[] args){
//创建键盘录入对象
Scanner input = new Scanner(System.in);
//创建Javabean对象
GirlFriend gf = new GirlFriend();
while(true){
try {
System.out.println("请输入名称:");
String name = input.nextLine();
gf.setName(name);
System.out.println("请输入年龄:");
String strAge = input.nextLine();
int age = Integer.parseInt(strAge);
gf.setAge(age);
break;
}catch (NumberFormatException e){
e.printStackTrace();
}catch (NameFormatException e){//自定义异常类
e.printStackTrace();
}catch (AgeOutOfBoundsException e){
e.printStackTrace();
}
}
System.out.println(gf);
}
}