异常Exception
- 概念
- 异常分类
- 异常处理机制
- 异常抛出
- 自定义异常
概念
- 在程序运行过程中出现的错误,称为异常。异常就是程序运行过程中出现了不正常现象导致程序的中断。在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
❤️ 本回完! ❤️ ❤️ ❤️