Java SE《基础篇》——(七)异常

概念

异常是Java中提供的一种识别及响应错误情况的一致性机制。有效地异常处理能使程序更加健壮、易于调试。

异常发生的原因有很多,比如

  • 用户输入了非法数据
  • 要打开的文件不存在
  • 网络通信时连接中断
  • JVM内存溢出

这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。

系统异常分类

这里写图片描述

Error

概念

系统内部错误,这类错误由系统进行处理,程序本身无需捕获处理。
比如:OOM(内存溢出错误)、VirtualMachineError(虚拟机错误)、StackOverflowError(堆栈溢出错误)等,一般发生这种情况,JVM会选择终止程序。

示例
//堆栈溢出错误
public class TestError {
    public static void recursionMethod() {
        recursionMethod();// 无限递归下去
    }
    public static void main(String[] args) {
        recursionMethod();
    }
}

报错信息:
Exception in thread "main" java.lang.StackOverflowError
    at com.TestError.recursionMethod(TestError.java:5)
    at com.TestError.recursionMethod(TestError.java:5)
    at com.TestError.recursionMethod(TestError.java:5)
    at com.TestError.recursionMethod(TestError.java:5)
    at com.TestError.recursionMethod(TestError.java:5)
    at com.TestError.recursionMethod(TestError.java:5)
    ... ...

Exception

介绍

Exception是所有异常类的父类。分为非RuntimeException和RuntimeException 。

  • 非RuntimeException
    指程序编译时需要捕获或处理的异常,如IOException、自定义异常等。属于checked异常。
  • RuntimeException
    指程序编译时不需要捕获或处理的异常,如:NullPointerException等。属于unchecked异常。
    一般是由程序员粗心导致的。如空指针异常、数组越界、类型转换异常等。
示例
//空指针异常
public class TestException {
    private static int[] arr;
    public static void main(String[] args) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

报错信息:
Exception in thread "main" java.lang.NullPointerException
    at com.TestException.main(TestException.java:7)
常用方法

Exception类和其他普通类一样,有自己的属性和方法,为我们提供异常的相关信息。常用的方法有:

方法说明
public String getMessage()返回关于发生的异常的详细信息。这个消息在Throwable类的构造函数中初始化了。
public void printStackTrace()打印toString()结果和栈层次到System.err,即错误输出流。


【示例】

public class TestException {
    public static void main(String[] args) {
        Exception exp = new Exception("异常方法演示");
        //打印异常信息
        System.out.println("exp.getMessage()=" + exp.getMessage());
        //跟踪异常栈信息
        exp.printStackTrace();
    }
}
异常捕获与处理

程序在执行时如果发生异常,会自动的生成一个异常类对象,并提交给JAVA运行环境,这个过程称为抛出异常。程序也可以自行抛出异常。
当出JAVA运行环境接收到异常对象时,会寻找能处理这个异常的代码并按程序进行相关处理,这个过程称为捕获异常

throws

【语法格式】
修饰符 返回类型 方法名(参数列表) throws 异常类名列表

【示例】
public class TestException {
public static void main(String[] args) throws FileNotFoundException{
File file = new File("our.txt");
InputStream input = new FileInputStream(file);
}
}

【注意】
子类继承父类,并重写父类的方法时,若方法中抛出异常,则要求:子类方法抛出异常只能是父类方法抛出的异常的同类或子类。

【示例】
演示子类重写父类方法时,抛出的异常不能比父类抛出的异常大。

throw

throw的作用是抛出异常,抛出一个异常类的实例化对象。

【语法格式】
throw new XXXException();

【示例】
public class ExceptionDemo {
public static void main(String[] args) throws Exception {
Exception exp = new Exception("异常方法演示");
throw exp;
}
}

【总结】

  • 这种抛出异常的方式一般在满足某条件时主动抛出,即满足用户定义的逻辑错误发生时执行。
  • 含有throw语句的方法,或者调用其他类的有异常抛出的方法时,必须在定义方法时,在方法头中增加throws异常类名列表。
  • 使用throws关键字声明的方法表示此方法不处理异常,而交给方法调用处进行处理。
try…catch

【语法格式】

try{
     有潜在异常抛出的语句组
}catch(异常类名 异常形参){
     异常处理语句组     
}catch(异常类名 异常形参){
     异常处理语句组
}catch(异常类名 异常形参){
     异常处理语句组
}catch(异常类名 异常形参){
     异常处理语句组
}finally{
     语句组
}

其中:
1. try用来捕获语句组中的异常
2. catch用来处理异常可以有一个或多个,而且至少要有一个catch语句或finally语句
3. finally中的语句组无论是否有异常都会执行

常用捕捉异常方式
1. try…catch try…finally
2. try…catch…finally
3. try…catch1…catch2…finally(体现异常出现的大小顺序)
说明:多重catch处理异常,大异常类在后,小异常类在前。

【示例】
举例演示try…catch捕获异常。

自定义异常

系统定义的异常主要用来处理系统可以预见的常见运行错误,对于某个应用所特有的运行错误,需要编程人员根据特殊逻辑来创建自己的异常类。

【语法格式】
public class 自定义异常类名 extends Exception{ … }

【示例】
某市举行青少年足球赛,报名要求不大于18岁。请自定义异常,当报名的选手不满足要求时,抛出”年龄大于18岁”的异常信息。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值