概念
- 在程序运行过程中出现的错误,称为异常。异常就是程序运行过程中出现了不正常现象导致程序的中断。在Java中,把各种异常现象进行了抽象形成了异常类。
- 异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。
- 程序错误分为三种:
- 编译错误:程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置。
- 运行时错误:程序在执行时,运行环境发现了不能执行的操作。
- 逻辑错误:程序没有按照预期的逻辑顺序执行。
异常分类
- 异常类结构(不完整):
- 通常,Java的异常分为受查异常(checked exceptions)和非受查异常(unchecked exceptions)。
- 受查异常: 包括Exception及其子类(不包括运行时异常,即RuntimeException与其子类),这种异常的特点是Java编译器会检查它,必须处理后才能通过编译。
- 非受查异常: 包括运行时异常(RuntimeException与其子类)和Error,表示程序中出现了编程错误,应该找出错误修改程序。
异常处理机制
-
try:监控区域,执行可能产生异常的代码,不能单独出现。当try块中有语句引发异常时,系统将不再执行try块中未执行的语句,而执行匹配的catch块。
-
catch:捕获、处理异常。一般按照由小到大的顺序捕获,也就是先截获子异常,再截获父异常。
-
finally:善后处理,无论是否发生异常,代码总能执行。finally必须和try一块使用。
-
如果在catch中遇到了return或者异常等能使该函数终止的话那么有finally就必须先执行完finally代码块里面的代码然后再返回值。
-
一般格式:
try { } catch (OneException e) { } catch (TwoException e) { } finally { }
或者:
try { } catch (OneException e1|TwoException e2) { //从小到大用|隔开 }finally { }
-
示例:
class Person{ String name; } public class Test { public static void main(String[] args) { Person p = null; try{ p.name = "我是一个不能赋值给null的字符串"; }catch(java.lang.NullPointerException e1){ //捕获指针异常 System.out.println("空指针异常"); }finally{ System.out.println("end1"); } try{ System.out.println(100 / 0); }catch(Exception e2){ //捕获所有异常 System.out.println("0不能作为分母出现!请回小学补习算术"); }finally{ System.out.println("end2"); } } }
-
输出:
空指针异常 end1 0不能作为分母出现!请回小学补习算术 end2
异常抛出
-
throw用于手动抛出异常,作为程序员可以在任意位置手动抛出异常
-
throws用于在方法上标识要暴露的异常,抛出的异常交由调用者处理
-
throw用在方法内,后面跟上要抛出的异常类对象;throws修饰在方法上,告诉调用者此方法可能会抛出异常,后面跟上要抛出的异常类名
-
示例:
class Bar{ int age; public Bar(int age){ this.age = age; } void check()throws IllegalArgumentException{ //throws 声明标识可能出现的异常 if(age < 18){ throw new IllegalArgumentException("年龄不符合要求"); //throw 抛出异常 } } } public class Test { public static void main(String[] args) { Bar b = new Bar(15); try{ b.check(); }catch(IllegalArgumentException e){ System.out.println(e.getMessage()); //打印返回异常的详细消息字符串 e.printStackTrace(); //追踪堆栈异常信息 } System.out.println("end"); } }
-
输出:
年龄不符合要求 end java.lang.IllegalArgumentException: 年龄不符合要求 at Bar.check(Test.java:8) at Test.main(Test.java:18)
自定义异常
-
自定义异常类必须从已有的异常类继承
-
建立新的异常类型最简单的方法就是让编译器产生默认构造方法
-
对异常来说,最重要的部分就是它的类名
-
可以为异常类定义一个接收字符串参数的构造方法,字符串参数描述异常信息
-
格式:
public class CustomException extends Exception { //无参构造方法 public CustomException(){ super(); } //有参的构造方法 public CustomException(String message){ super(message); } // 用指定的详细信息和原因构造一个新的异常 public CustomException(String message, Throwable cause){ super(message,cause); } //用指定原因构造一个新的异常 public CustomException(Throwable cause) { super(cause); } }
-
示例
class Bar{ int age; public Bar(int age){ this.age = age; } void check()throws myException{ if(age < 18){ throw new myException("年龄不符合要求"); } } } class myException extends Exception{ private String message; public myException(String message){ super(message); } } public class Test { public static void main(String[] args) { Bar b = new Bar(15); try{ b.check(); }catch(myException e){ System.out.println(e.getMessage()); e.printStackTrace(); } System.out.println("end"); } }
-
输出:
年龄不符合要求 myException: 年龄不符合要求 at Bar.check(Test.java:8) at Test.main(Test.java:26) end
❤️ 本回完! ❤️ ❤️ ❤️