异常处理
异常处理概述
异常就是一个表示阻止执行正常进行的错误或情况。简单说异常就是程序运行过程中出现的不正常现象。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 }