JavaSE之异常处理

1. 什么是异常?

在程序执行过程中出现的报红现象叫作异常,如下图:
异常(Exception) 指在程序正常运行过程中,由于某些意外发生而引起程序终止运行的意外情况。需要注意的是异常不是错误(Error),Java中的错误特指毁灭性的、程序员无法解决的错误,如JVM崩溃、硬件损坏。

2.Java 中异常相关类结构

在这里插入图片描述

  1. Throwable类:所有异常和错误的超类,有两个子类分别是错误(Error)和异常(Exception)。
  2. 其中异常类Exception又可分为编译期异常(非运行期异常)和运行期异常(RuntimeException)。编译期异常是除过运行期异常以外的异常,是强行处理的异常;运行期异常一般是由程序逻辑错误引起的异常,在程序运行过程中会出现的异常。

3.Java中常见的异常

1.java.lang.NullPointerException:空指针异常

2. java.lang.ArrayIndexOutOfBoundsException:数组下标越界

3. java.lang.ClassCastException:类型转换异常

4. java.lang.ArithmeticException:算术异常

5. java.lang.NumberFormatException:数字格式化异常

6. java.io.IOException:IO 异常(输入输出异常)

7. java.sql.SQLException:SQL 异常(数据库异常)

8. java.lang.ClassNotFoundException:类找不到异常

9. java.io.FileNotFoundException:文件找不到异常

4.Java异常处理机制

1.try(引发异常):是由于引发异常或监控可能出现异常的代码,将可能出现异常的代码放到try块中,当其中的代码一旦出现异常,则try块就可以检测到并交给catch进行捕获及处理。例:

        Scanner scanner = new Scanner(System.in);
        Integer result = null;
        try {
            System.out.print("请输入第一个数字:");
            Integer num1 = scanner.nextInt();//非法输入异常

            System.out.print("请输入第二个数字:");
            Integer num2 = scanner.nextInt();//非法输入异常

            result = num1 / num2;//算数异常

        }finally{//单纯try语句会报异常: 'try' 不带有 'catch', 'finally' 或资源声明           
            System.out.print("结果为:" + result);
        }
        System.out.println("程序结束!");

注意 :try{}不能单独使用,必须和catchfinally一起使用。

2.catch(处理):是用于捕获并处理异常;由于一段或n段代码可能出现多个不同类型的异常,我们在使用时一般使用多重catch来处理不同类型的异常。例:

        Scanner scanner = new Scanner(System.in);
        Integer result = null;
        try {
            System.out.print("请输入第一个数字:");
            Integer num1 = scanner.nextInt();//非法输入异常
            System.out.print("请输入第二个数字:");
            Integer num2 = scanner.nextInt();//非法输入异常
            result = num1 / num2;//算数异常
        }catch (InputMismatchException ex){
            System.out.println("您输入的数字有误!");
            ex.printStackTrace();//打印异常信息
        }catch (ArithmeticException ex){
            System.out.println("除数不能为零");
            ex.printStackTrace();
        }catch (Exception ex){
            /**其他异常
             * Exception可以捕获到所有异常;如果需要捕获多个异常的情况将
             * Exception放到最后一个catch处理
             */
            System.out.println("未知异常");
        }

3. finally(最终):最终会被执行的,在finally代码块中的代码无论是否出现异常都会被执行到。(完整例子):

Scanner scanner = new Scanner(System.in);
        Integer result = null;
        try {
            System.out.print("请输入第一个数字:");
            Integer num1 = scanner.nextInt();//非法输入异常

            System.out.print("请输入第二个数字:");
            Integer num2 = scanner.nextInt();//非法输入异常
            result = num1 / num2;//算数异常
        }catch (InputMismatchException ex){
            System.out.println("您输入的数字有误!");
            ex.printStackTrace();//打印异常信息
        }catch (ArithmeticException ex){
            System.out.println("除数不能为零");
            ex.printStackTrace();
        }catch (Exception ex){
            /**其他异常
             * Exception可以捕获到所有异常;如果需要捕获多个异常的情况将
             * Exception放到最后一个catch处理
             */
            System.out.println("未知异常");
        }finally {
            System.out.print("结果为:" + result);
        }
        System.out.print("程序结束");

4.throws(抛出异常):在方法声明部分抛出异常,告诉调用者当前方法内部会出现XXX异常;抛出去,让别人处理。

    public void chu(Integer num1, Integer num2) throws ArithmeticException, NullPointerException {
        int result = num1 / num2;
        System.out.println(result);
    }

    public void Jisuan() throws ArithmeticException, NullPointerException {
        chu(10, 0);//运行期异常不会报错,需要抛出去
    }

5.throw(引发新异常):在方法体内部使用,用于抛出新异常(引发新异常),新异常为业务异常;通过 throw 关键字来引发新异常,引发的新异常需要直接使用 try-catch 处理或使用 throws 抛出。

   public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入您的年龄:");
        int age=scanner.nextInt();
        if(age>=18){
            System.out.println("欢迎光临!");
        }else{
            throw new AgeException("未成年人不得入内");//出现异常要么处理要么抛出
        }
    }

5.自定义异常

当系统提供的异常类无法满足我们实际开发需求时,开发人员就要根据实际情 况自定义异常;自定义异常需要继承 Exception 类Exception 的子类;

    public class AgeException extends RuntimeException {
    public AgeException(){
        System.out.println("年龄不符");
    }

    public AgeException(String message){//提供明确的提示信息
        super(message);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值