异常处理

异常处理概述

  异常就是一个表示阻止执行正常进行的错误或情况。简单说异常就是程序运行过程中出现的不正常现象。Java把经常出现的一些异常现象进行了抽象,就形成了异常类。

A、Error类异常

B、Exception类下的编译异常(除了RunTimeException)

C、Exception类下的运行异常

-----------------------------------------------------------------------

1、编译异常 -> throws 抛出异常,如下:

 1 import java.text.ParseException;
 2 import java.text.SimpleDateFormat;
 3 import java.util.Date;
 4 //编译异常的处理
 5     //编译异常产生以后,必须给出处理方案,没有默认处理机制,要么抛出,要么捕获!
 6 public class ExceptionTest02 {
 7     public static void main(String[] args) throws ParseException {  //抛出 解析异常
 8         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 9         //SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
10         Date date = sdf.parse("2022/04/15");    //格式不对应
11         System.out.println(date);
12     }
13 }

2、编译异常 -> try...catch 捕获异常,如下:

 1 import java.text.SimpleDateFormat;
 2 import java.util.Date;
 3 
 4 public class ExceptionTest03 {
 5     public static void main(String[] args) {
 6         method();
 7         System.out.println("main中后续代码...");
 8     }
 9     public static void method(){
10         try{
11             System.out.println("异常产生前");
12             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
13             Date date = sdf.parse("2022/05/16");//格式不对应
14             System.out.println("异常产生后");
15             System.out.println(date);
16         }catch (Exception e){
17             System.out.println("捕获异常");
18             //System.out.println(e.getMessage());//返回异常的信息
19             e.printStackTrace();//打印异常的跟踪信息
20         }
21         System.out.println("method()后续代码。。。");
22     }
23 }

3、运行异常 -> 默认方式:抛出异常,如下:

1 public class ExceptionTest {  //运行异常 -> 默认方式:抛出异常
2     public static void main(String[] args) {
3         String s = null;
4         s.length();  //空指针异常
5         System.out.println("后续代码。。。");
6     }
7 }

4、运行异常 -> 自主选择捕获处理(最常用吧!)

  好处:可以catch多个异常;catch后续代码可执行。

 1 import java.text.ParseException;
 2 import java.text.SimpleDateFormat;
 3 import java.util.Date;
 4 /*
 5 * 运行异常 -> 手动的选择捕获处理,处理运行异常
 6 *   运行异常如果被我们手动捕获,将不会再采取抛出处理,而是采用捕获处理
 7 *   如果我们没有在catch中捕获对应的运行异常,会采取默认抛出处理
 8 * Exception类下的除了RuntimeException类及其子类,其它都是编译异常;
 9 * RuntimeException类及其子类都是运行异常
10 * */
11 public class ExceptionTest05 {
12     public static void main(String[] args) {
13         method();
14     }
15 
16     public static void method(){
17         try {
18             Object o = new String();
19             Integer o1 = (Integer) o;   //类型转换异常 ClassCastException
20 
21             String s = null;
22             s.length();
23 
24             int[] arr = {1};
25             System.out.println(arr[2]);
26 
27             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
28             Date date = sdf.parse("2020/09/09");
29         }catch (NullPointerException e){    //空指针异常
30             e.printStackTrace();
31         }catch (IndexOutOfBoundsException e){   //数组下标越界异常
32             e.printStackTrace();
33         }catch (ParseException e){  //解析异常
34             e.printStackTrace();
35         }
36 /*        catch (Exception e){  //父类异常,必须放最后
37             e.printStackTrace();
38         }*/
39         System.out.println("后续代码");
40     }
41 }
//try中有异常,会去匹配catch,没有的话就默认抛出异常

上面执行结果是属于 运行异常 -> 默认方式:抛出异常 方式的,不会执行”后续代码“;如果最后有主动catch父类异常,会执行”后续代码“。

--------------------------------------------------------------

关于继承状态下异常的处理

  如果父类方法没有抛出异常,重写后也不能抛出异常;如果父类方法抛出了异常,重写后,可以抛出相同的异常,或者子异常,或者不抛出异常。

1.子类不能抛出比父类更大的”编译异常“;2.”运行异常“不受限制

public class Fu {
    public void method() throws Exception {
        System.out.println("父类method");
    }
}

//子类可以抛出比它小的编译异常
import java.io.IOException;
public class Zi extends Fu {
    @Override
    public void method() throws IOException {
        System.out.println("子类method");
    }
}
public class Fu {
    public void method() {
        System.out.println("父类method");
    }
}

//2.父类不抛,子类可以抛出运行异常
public class Zi extends Fu {
    @Override
    public void method() throws RuntimeException {
        System.out.println("子类method");
    }
}

------------------------------------------------------------

自定义一个异常类

如果异常继承自Exception,就是编译异常;如果异常继承自RuntimeException,就是运行异常

 

 1 package myexception;
 2 /*
 3 自定义一个异常类,用于验证身份证的输入格式是否正确
 4 属于对于程序的语法的检查校验,这个异常应该被声明为一个编译异常
 5 类中提供了一个有参构造,用于接受异常信息
 6 */
 7 public class IdentityCardCheckException extends Exception{
 8     public IdentityCardCheckException() {
 9         super();
10     }
11     public IdentityCardCheckException(String message) {
12         super(message);
13     }
14 }
 1 package myexception;
 2 public class Register {
 3     public void registerUser(String identity) throws IdentityCardCheckException {
 4         //验证你的身份信息是否正确
 5         //xxx xxx xxxxxxx xxxx = 18位
 6         if (identity.length() >=1 && identity.length() <= 18){
 7             System.out.println("注册成功");
 8         }else {
 9             throw new IdentityCardCheckException("length:" + identity.length());
10         }
11     }
12 }
 1 package myexception;
 2 public class Test {
 3     public static void main(String[] args) {
 4         String s = "3303331986050401281";
 5         Register register = new Register();
 6         try {
 7             register.registerUser(s);
 8         } catch (IdentityCardCheckException e) {
 9             e.printStackTrace();
10         }
11     }
12 }
posted @ 2022-04-16 00:35  鹿先森JIAN  阅读(100)  评论(0编辑  收藏  举报