Java异常体系及重点

1.什么是异常:

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。

异常的分类:

在这里插入图片描述

所有的异常类是从 java.lang.Exception 类继承的子类。

Error 用来指示运行时环境发生的错误。

Exception又分为RunTimeException其他Exception

2.Java 异常的处理机制

Java的异常处理本质上是抛出异常捕获异常

cry-catch

try{
    监控区域   
}catch(Exception e){
    //捕获异常
}

例如:
数组越界问题

public class test {

    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        try {     //监控区域
            System.out.println(arr[3]);//数组越界
        } catch (ArrayIndexOutOfBoundsException e) {  //捕获异常
            System.out.println("你访问的数组下标不存在");
            e.printStackTrace();//打印错误栈信息
        } finally {//处理善后工作
            System.out.println("请重新输入");
        }
    }

3.多重捕获块:

如果要捕获多个异常,从小到大开始捕获

try{
   // 程序代码
}catch(异常类型1 异常的变量名1){
  // 程序代码
}catch(异常类型2 异常的变量名2){
  // 程序代码
}catch(异常类型3 异常的变量名3){
  // 程序代码
}

如果保护代码中发生异常,异常被抛给第一个 catch 块。

如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。

如果不匹配,它会被传递给第二个 catch 块。

如此,直到异常被捕获或者通过所有的 catch 块。

4.throws/throw 关键字:

public  void tryUser(String userName,String passWord) throws UserNameException {
        if (!userName.equals(USER)) {
            // 抛出用户名错误异常
            throw new UserNameException("用户名错误!");//extends Exception
        }
        if (!passWord.equals(PASSWORD)) {
            // 抛出密码错误异常
            throw new PasswordException("密码错误!");//extends RuntimeException
        }
    }

1、throws出现在方法函数头;throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常
3、两者都只是抛出或者可能抛出异常,但不会去处理异常,真正的处理异常由函数的上层调用处理。

5.finally关键字:

finally 关键字用来创建在 try 代码块后面执行的代码块。

无论是否发生异常,finally 代码块中的代码总会被执行

try{
  // 程序代码
}catch(异常类型1 异常的变量名1){
  // 程序代码
}catch(异常类型2 异常的变量名2){
  // 程序代码
}finally{
  // 程序代码
}

6.RunTimeException和其他Exception:

受查异常:

除了非受查异常以外都是受查异常,如IOEcxception

非首查异常:

Error和RuntimeException及其子类

其他Exception受查异常。可以理解为错误,必须要开发者解决以后才能编译通过,解决的方法有两种,
1:throw到上层,
2:try-catch处理。

RunTimeException:运行时异常,又称不受检查异常,不受检查。因为不受检查,所以在代码中可能会有RunTimeException时Java编译检查时不会告诉你有这个异常,但是在实际运行代码时则会暴露出来,比如经典的1/0,空指针等。如果不处理也会被Java自己处理。

7.自定义异常:

java支持自定义异常,以用户登录举例:

UserNameException:
继承Exception,需要添加异常到方法签名。

public class UserNameException extends Exception{
    public UserNameException(String massage){
        super(massage);
    }
}

PasswordException:
继承RuntimeException,无需添加异常到方法签名,只在方法内抛出即可。

public class PasswordException extends RuntimeException{
    public PasswordException(String massage){
        super(massage);
    }
}

自定义异常类:

public class User {

    public static final String USER = "Yusean";

    public static final String PASSWORD = "123456";

    public  void tryUser(String userName,String passWord) throws UserNameException {
        if (!userName.equals(USER)) {
            // 抛出用户名错误异常
            throw new UserNameException("用户名错误!");
        }
        if (!passWord.equals(PASSWORD)) {
            // 抛出密码错误异常
            throw new PasswordException("密码错误!");
        }
    }
}

异常测试类:

public class UserTest {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入账号用户名:");
        String userName = scanner.next();
        System.out.println("请输入密码:");
        String passWord = scanner.next();
        User user = new User();
        try{
            user.tryUser(userName,passWord);
            System.out.println("登录成功!");
        }catch (UserNameException | PasswordException e){
            e.printStackTrace();
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值