Java基础-异常

本文介绍了Java中的异常概念,包括异常的类型(编译时异常和运行时异常),Throwable类中的常用方法,异常处理机制(try-catch和finally),以及如何使用throws和throw关键字。同时讲解了自定义异常类的创建和应用。
摘要由CSDN通过智能技术生成

目录

一 异常

1 什么是异常

2 异常体系

3 异常的类型

(1)编译时异常

(2)运行时异常

(3)java中常见的运行时异常

3 Throwable类中常用方法

4 异常处理

5 throws关键字

6 throw关键字

7 自定义异常类


一 异常

1 什么是异常

生活中的异常:例如感冒发烧,工作时电脑蓝屏、死机等。

程序中的异常:在程序运行的过程中,也会发生这种非正常状况,例如程序运行时磁盘空间不足、网络连接中断、被加载的类不存在等。

程序异常解决方法:针对程序中的非正常情况,Java语言中引入了异常,以异常类的形式对这些非正常情况进行封装,并通过异常处理机制对程序运行时发生的各种问题进行处理。

2 异常体系

Exception:称为异常类,它表示程序本身可以处理的错误。在Java程序开发中进行的异常处理,都是针对Exception类及其子类的。

Error:称为错误,表示Java运行时产生的系统内部错误或资源耗尽的错误,是比较严重的,仅靠修改程序本身是不能恢复执行的,例如系统崩溃,虚拟机错误等。

3 异常的类型

(1)编译时异常

在程序编译时期产生的异常,而这些异常必须要进行处理,也称为checked异常
在Exception的子类中,除了RuntimeException类及其子类外,其他子类都是编译时异常

特点

| 编译时异常的特点是在程序编写过程中,Java编译器就会对编写的代码进行检查,如果出现比较明显的异常就必须对异常进行处理,否则程序无法通过编译。 | | ------------------------------------------------------------ |

(2)运行时异常

这种异常即使不编写异常处理代码,依然可以通过编译,也称为unchecked异常。
RuntimeException类及其子类都是运行时异常。

特点

| 运行时异常是在程序运行时由Java虚拟机自动进行捕获处理的,即使没有使用try..catch语句捕获或使用throws关键字声明抛出,程序也能编译通过,只是在运行过程中可能报错。 | | ------------------------------------------------------------ |

(3)java中常见的运行时异常

异常类名称异常类说明
ArithmeticException,算术异常
IndexOutOfBoundsException角标越界异常
ClassCastException类型转换异常
NullPointerException空指针异常
NumberFormatException数字格式化异常

4 Throwable类中常用方法

方法声明功能描述
String getMessage()返回此throwable的详细消息字符串
void printStackTrace()将此throwable及其追踪输出至标准错误流
void printStackTrace(PrintStream s)将此throwable及其追踪输出到指定的输出流

5 异常处理

当程序发生异常时,会立即终止,无法继续向下执行。为了保证程序能够有效的执行,Java中提供了一种对异常进行处理的方式——异常捕获。

异常捕获的语法格式:

    try {
         // 可能发生异常的语句
    } catch(Exception类或其子类 e){
         // 对捕获的异常进行相应处理
    }

例如:

try{
    int a = 1/0;// 出现异常
    System.out.println("hello"); // try块中异常代码后面的内容不会执行
}catch(Exception e){ // 捕获异常
    e.printStackTrace(); //打印异常信息
}
System.out.println("world");//try...catch处理异常后的代码可以正常执行

如果有些语句无论程序是否发生异常都要执行,可以放在finally代码:

    try {
         // 可能发生异常的语句
    } catch(Exception类或其子类 e){
         // 对捕获的异常进行相应处理
    }finally{
        //一定会执行的代码
    }

例如:

try{
    int a = 1/0;// 出现异常
    System.out.println("hello"); // try块中异常代码后面的内容不会执行
}catch(Exception e){ // 捕获异常
    e.printStackTrace(); //打印异常信息
}finally{
    System.out.println("释放资源...");//一定会执行
}
System.out.println("world");//try...catch处理异常后的代码可以正常执行

6 throws关键字

如果不确定或者并不急于处理异常,怎么办?

一般在程序开发中,开发者通常会意识到程序可能出现的问题,可以直接通过try...catch对异常进行捕获处理。但有些时候,方法中代码是否会出现异常,开发者并不明确或者并不急于处理,为此,Java允许将这种异常从当前方法中抛出,然后让后续的调用者在使用时再进行异常处理。

throws关键字抛出异常的基本语法格式:

    [修饰符] 返回值类型 方法名([参数类型 参数名1...]) throws 异常类1,异常类2,... {
        // 方法体...
    }

注意:

throws关键字需要写在方法声明的后面,并在后面需要声明方法中发生异常的类型
当调用者在调用有抛出异常的方法时,除了可以在调用程序中直接进行try…catch异常处理外,也可以根据提示使用throws关键字继续将异常抛出,这样程序也能编译通过。但是,程序发生了异常,终究是需要进行处理的,如果没有被处理,程序就会非正常终止。

例如:

    //有异常的方法
    public void test1() throws Exception{
        int a = 1/0;
    }
    //调用者
    public void test2(){
        //调用抛出异常的方法:捕获处理
        try {
            test1();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //调用者
    public void test3() throws Exception {//声明异常
        //调用抛出异常的方法:抛出处理
        test1(); 
    }

7 throw关键字

程序开发中,除了可以通过throws关键字抛出异常外,还可以使用throw关键字抛出异常。

格式:

throw new 异常类();

注意:

| 如果throw抛出的是Error、RuntimeException或它们的子类异常对象,则无需使用throws关键字或try…catch对异常进行处理。 | | ------------------------------------------------------------ |

例如:

    public void test4()  {
        //抛出异常对象:抛出运行时异常,可以不处理
        throw new ArithmeticException();
    }
    public void test5()  {
        //抛出异常对象:抛出编译时异常,必须处理
        throw new ClassNotFoundException();//报错
    }

throw和throws区别

throw:throw关键字用于方法体内,并且抛出的是一个异常类对象。
throws:throws关键字用在方法声明中,用来指明方法可能抛出的多个异常类

8 自定义异常类

Java中定义了大量的异常类,虽然这些异常类可以描述编程时出现的大部分异常情况,但是在程序开发中有时可能需要描述程序中特有的异常情况,例如在设计divide()方法时不允许被除数为负数

解决方法:Java允许用户自定义异常,但自定义的异常类必须继承自Exception或其子类。

自定义异常类示例:

class DivideByMinusException  extends Exception{
    public DivideByMinusException (){
        super();          // 调用Exception无参的构造方法
    }
    public DivideByMinusException (String message){
        super(message); // 调用Exception有参的构造方法
    }   
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值