异常再总结

目录

什么是异常

算数异常

数组越界异常

空指针异常

异常的分类

编译时异常

运行时异常

异常的抛出(throw关键字)

异常的捕获

throws关键字

try丶catch关键字

finally关键字

自定义异常

总结


什么是异常

指的就是程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。

我们在平时写代码的过程中就可能会遇到异常,常见的异常例子:

算数异常

在JAVA中,我们都知道0不能作为除数,只能作为被除数,如果把0作为除数,编译器就会提示我们出先算术异常了。

数组越界异常

数组越界异常也很常见,指的是在使用数组时,如果超过了数组的大小,就会形成越界。程序就会发生异常,从而终止运行。

空指针异常

对于数组arr,让它赋值为null,我并没有让它指向任何对象,它就是一个空指针。对于空指针进行访问,编译器就会提示我们空指针异常。

异常的分类

在代码运行时,可能会出现异常种类有很多,为了对不同异常或者错误进行很好的分类管理,Java内部维护了一个异常的体系结构:

异常可能在编译时发生,也可能在程序运行时发生,根据发生的时机不同,可以将异常分为运行时异常和编译时异常。

编译时异常

编译时异常,也称为受检查异常。从名字我们就能够理解,就是程序在编译的时候发生的异常。

运行时异常

在程序执行期间发生的异常,称为运行时异常,也称为非受检查异常。

编译时出现的语法性错误,不能称之为异常。编译过程中就会出错, 这是 “编译期” 出错。而运行时指的是程序已经编译通过得到class 文件了,再由 JVM 执行过程中出现的错误.

在Java中,异常处理主要的5个关键字:throw、try、catch、finally、throws

异常的抛出(throw关键字)

在Java中,可以借助throw关键字,抛出一个指定的异常对象,将错误信息告知给调用者

使用方法:throw new XXXException(“异常产生的原因”); 例如:

public static void main(String[] args) {
        throw new RuntimeException();
}

代码没错,但使用throw抛出的一个异常,程序就会反馈给我一个异常。

总结一下throw在使用过程中要注意的一些地方:

  1. throw必须写在方法体内部

  2. 抛出的对象必须是Exception 或者 Exception 的子类对象

  3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则可以不用处理,直接交给JVM来处理

  4. 如果抛出的是编译时异常,用户必须处理,否则无法通过编译

  5. 异常一旦抛出,其后的代码就不会执行

异常的捕获

        异常的捕获,就是异常的具体处理方式,主要有两种:异常声明throws 和try-catch捕获然后进行处理。

throws关键字

        throws一般位于方法声明时参数列表之后。 使用方法:

        修饰符 返回值 方法名(形参)throws 异常类型(可以有多个异常类型)

try丶catch关键字

使用方式 :

public static void main(String[] args) {
            try{
                //代码
            }catch (){//()里面写你想捕捉的异常
                //处理异常的代码
            }catch (){
                //同上
            }
        }
  1. try里面的代码不一定会发生异常。

  2. 如果代码发生了异常,且被catch捕获到了,就会进行对应的处理,处理完成后就会跳出try-catch执行后面的语句。

  3. 如果代码发生了异常,但不是写catch语句预期捕捉的异常的话,那么这个异常不会捕捉到,后面的代码就不会被执行。

  4. try-catch可以捕捉多个异常,但不是同时捕获。如果有多个异常,只能逐个捕获。

  5. 如果有多个异常,并且有父子类关系,可以直接写Exception,因为它是所有异常的父类,但是也不建议这么写,因为Exception的范围太广了,因为每个异常处理的方法不一样。

  6. 如果使用Exception,那么在写catch的时候,要么只写一个catch语句,里面放Exception,后面就不能继续写catch语句了,因为写了也没什么用,而且出现的异常都会被Exception进行捕获。要么就把Exception放在最后写,前面写你想捕获的异常,在最后再使用Exception。

  7. try里面抛出异常位置之后的代码将不会被执行

finally关键字
 public static void main(String[] args) {
            try{
                //代码
            }catch (RuntimeException e){
                //()里面写你想捕捉的异常
                //处理异常的代码
            }catch (Exception e){
                //同上
            } finally{
                //代码
         }
    }

finally的作用:finally后面的代码一定会执行

自定义异常

具体方式:

  1. 自定义异常类,然后继承自Exception 或者 RunTimeException

  2. 实现一个带有String类型参数的构造方法,参数含义:出现异常的原因

举例:

        如果我们要实现一个登录账号的功能,在用户名或者密码错误时能够提示我们一下.而这个时候我们就可以使用自定义异常来解决这个问题.

 实现第二个构造方法

 

 写一个登录:

 public static void main(String[] args) {
        String userName1 = "admin";
        String password1 = "123456";
        Scanner scanner =  new Scanner(System.in);
        System.out.print("请输入用户名:");
        String userName2 = scanner.next();
        System.out.print("请输入密码:");
        String password2 = scanner.next();
        if (!userName1.equals(userName2)){
            throw new LoginException("用户名错误!");
        }
        if (!password1.equals(password2)){
            throw new LoginException("密码错误!");
        }
        System.out.println("登录成功!");
    }

自定义异常:

public class LoginException extends RuntimeException{
    public LoginException(String message) {
        super(message);
    }
}

  • 自定义异常通常会继承自 Exception 或者 RuntimeException

  • 继承自 Exception 的异常默认是受查异常

  • 继承自 RuntimeException 的异常默认是非受查异常

总结

异常处理的流程

  1. 程序先执行 try 中的代码

  2. 如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配.

  3. 如果找到匹配的异常类型, 就会执行 catch 中的代码

  4. 如果没有找到匹配的异常类型, 异常得不到处理,就会交给JVM处理,程序就会异常终止.

  5. 无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行).

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值