Java 基础入门 | 第十二章 异常处理机制

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 目录异常概念异常分类检查异常也称为编译期异常ParseException 解析异常运行时异常ArithmeticException 算术异常ArrayIndexOutOfBoundsException数组下标越界异常ClassCastException类型转换异常异常处理方式使用try、


异常概念

什么是异常(Exception)

异常是程序在编译或运行过程出现的例外,这些例外在有的可以避免有的却无法避免

image.gif编辑

异常分类

根据异常的出现时期主要分为编译时异常和运行时异常两大类。分别对应在编写代码时时候和运行代码的时候。

检查异常也称为编译期异常

    • 不可避免  必须进行异常处理,要不编译器报错
    • Exception以及它的子类(除去RuntimeException)

    image.gif编辑 常见的编译期异常

    ParseException 解析异常

    import java.text.SimpleDateFormat;
    import java.util.Date;
    public class ParseException {
        public static void main(String[] args) {
            //根据指定模式创建SimpleDateFormat对象
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
            try {
                //将字符串日期按照yyyy年MM月dd日的模式解析为Date对象
                Date date=sdf.parse("2022-01-01");
                //输入解析的时间对象
                System.out.println(date);
            } catch (java.text.ParseException e) {
                //打印出解析字符串时间的异常
                e.printStackTrace();
            }
        }
    }

    image.gif

    当字符串不是以yyyy年MM月dd日的模式写的时候,就会出现解析异常

    运行时异常

    代码程序在运行的过程中肯能出现的异常,编译器在编译代码时,不能检测出来。

    常见的运行时异常有

    NullPointerException 空指针异常

    代码示例

    public class NullPointerException {
        public static void main(String[] args) {
            String name=null;
            System.out.println(name.hashCode());
        }
    }

    image.gif

    这样写代码的时候,对象为null的时候,去调用对象的方法和属性,运行程序就会出现空指针异常

    ArithmeticException 算术异常

     

    import java.util.Scanner;
    public class ArithmeticException {
        public static void main(String[] args) {
            //创建Scanner对象
            Scanner sc=new Scanner(System.in);
            //通过 Scanner 类来获取用户的输入
            int i=sc.nextInt();
            //输出10除以用户输入值的结果
            System.out.println(10/i);
        }
    }

    image.gif

    当用户输入0的时候,就会抛出算数异常。

    ArrayIndexOutOfBoundsException数组下标越界异常

    public class ArrayIndexOutOfBoundsException {
        public static void main(String[] args) {
            int[] nums=new int[3];
            System.out.println(nums[3]);
        }
    }

    image.gif

    创建一个只有3个元素的数组,数组的下标是从0开始的,也就是最后一个下标是2,当输入出超过2的下标的数组时候,就会出现数组下标越界异常。

    ClassCastException类型转换异常

    public class ClassCastException {
        public static void main(String[] args) {
            Object i=new Integer(10);
            String str=(String)i;
            System.out.println(str);
        }
    }

    image.gif

    Object是所有类的父类,父类转子类可以通过强行转化实现。但是Obejct类的参数赋值的是一个Integer类的对象,当它强行转化为文本的时候,就会抛出类型转换异常

    异常处理方式

    Java编译期异常必须要进行处理,否则Java源文件在编译时编译器会提示错误,且源文件无法成功编译

    Java编译期异常的处理方式有两种

      • 使用try、catch、finally关键字捕获异常
      • 使用throws关键字声明抛出异常

      使用try、catch、finally捕获异常

      try{
          //可能会出现异常的代码
       }catch(ParseException  e){
          //捕获执行的代码
       }finally{
          //不管是否发生异常都要执行的代码
       }

      image.gif

      finally根据情况可以省略

      import java.text.SimpleDateFormat;
      import java.util.Date;
      public class ParseException {
          public static void main(String[] args) {
              //根据指定模式创建SimpleDateFormat对象
              SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
              try {
                  //将字符串日期按照yyyy年MM月dd日的模式解析为Date对象
                  Date date=sdf.parse("2022-01-01");
              } catch (java.text.ParseException e) {
                  System.out.println("字符串不符合解析模式");
              }
          }
      }

      image.gif

      使用throws声明抛出异常

      import java.text.SimpleDateFormat;
      import java.util.Date;
      public class ParseException {
          public static void main(String[] args) throws java.text.ParseException {
              //根据指定模式创建SimpleDateFormat对象
              SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
              //将字符串日期按照yyyy年MM月dd日的模式解析为Date对象
              Date date=sdf.parse("2022-01-01");
          }
      }

      image.gif

      自定义异常

      在开发中,可能需要自定义异常类

      自定义异常根据继承的父类不同分为两类

        • 继承自Exception的自定义异常
        • 继承自RuntimeException的自定义异常

        继承自Exception的自定义异常为编译期异常必须要进行处理

        继承自RuntimeException的自定义异常为运行时异常不需要进行特别的处理。

        继承自Exception的自定义异常

        //自定义字符串空格异常
        public class StringBlankException extends Exception{
            public StringBlankException() {
                System.out.println("字符串有空格");
            }
            public StringBlankException(String message) {
                super(message);
            }
        }

        image.gif

        public class StringBlankExceptionTest {
            public static void main(String[] args) throws StringBlankException {
                String str="你好,我是李焕英! ";
                if(str.contains(" ")){
                    throw new StringBlankException();
                }
            }
        }

        image.gif

        继承自RuntimeException的自定义异常

        //自定义字符串空格异常
        public class StringBlankException extends RuntimeException{
            public StringBlankException() {
                System.out.println("字符串有空格");
            }
            public StringBlankException(String message) {
                super(message);
            }
        }

        image.gif

        public class StringBlankExceptionTest {
            public static void main(String[] args){
                String str="你好,我是李焕英! ";
                if(str.contains(" ")){
                    throw new StringBlankException();
                }
            }
        }

        image.gif


        相关文章
        |
        2天前
        |
        XML 安全 Java
        Java反射机制:解锁代码的无限可能
        Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
        15 5
        Java反射机制:解锁代码的无限可能
        |
        2天前
        |
        Java 程序员 开发者
        Java中的异常处理机制深度解析####
        本文将深入浅出地探讨Java编程语言中异常处理的核心概念与实践策略,旨在帮助开发者更好地理解如何构建健壮的应用程序。通过剖析异常体系结构、掌握有效的异常捕获与处理技巧,以及学习最佳实践,读者能够提升代码质量,减少运行时错误,从而增强软件的稳定性和用户体验。 ####
        |
        1天前
        |
        存储 缓存 安全
        🌟Java零基础:深入解析Java序列化机制
        【10月更文挑战第20天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
        9 3
        |
        1天前
        |
        安全 Java UED
        深入理解Java中的异常处理机制
        【10月更文挑战第25天】在编程世界中,错误和意外是不可避免的。Java作为一种广泛使用的编程语言,其异常处理机制是确保程序健壮性和可靠性的关键。本文通过浅显易懂的语言和实际示例,引导读者了解Java异常处理的基本概念、分类以及如何有效地使用try-catch-finally语句来处理异常情况。我们将从一个简单的例子开始,逐步深入到异常处理的最佳实践,旨在帮助初学者和有经验的开发者更好地掌握这一重要技能。
        7 2
        |
        2天前
        |
        Java 程序员 开发者
        Java编程中的异常处理艺术
        【10月更文挑战第24天】在Java的世界里,代码就像一场精心编排的舞蹈,每一个动作都要精准无误。但就像最完美的舞者也可能踩错一个步伐一样,我们的程序偶尔也会遇到意外——这就是所谓的异常。本文将带你走进Java的异常处理机制,从基本的try-catch语句到高级的异常链追踪,让你学会如何优雅地处理这些不请自来的“客人”。
        |
        3天前
        |
        Java 数据库连接 开发者
        Java中的异常处理机制####
        本文深入探讨了Java语言中异常处理的核心概念,通过实例解析了try-catch语句的工作原理,并讨论了finally块和throws关键字的使用场景。我们将了解如何在Java程序中有效地管理错误,提高代码的健壮性和可维护性。 ####
        |
        1天前
        |
        Java 程序员 UED
        Java中的异常处理:从基础到高级
        【10月更文挑战第25天】在Java的世界中,异常处理是维护程序健壮性的重要手段。本文将深入浅出地介绍Java异常处理的机制,从基本的try-catch-finally结构出发,逐步探讨更复杂的异常处理策略,如自定义异常、异常链以及如何利用异常处理提高代码的可读性和可维护性。通过具体示例,我们将看到如何优雅地处理异常,确保程序在面对不可预见的错误时仍能稳定运行。
        4 1
        |
        5天前
        |
        安全 Java 程序员
        深入浅出Java中的异常处理机制
        【10月更文挑战第20天】本文将带你一探Java的异常处理世界,通过浅显易懂的语言和生动的比喻,让你在轻松阅读中掌握Java异常处理的核心概念。我们将一起学习如何优雅地处理代码中不可预见的错误,确保程序的健壮性和稳定性。准备好了吗?让我们一起踏上这段旅程吧!
        20 6
        |
        3天前
        |
        存储 运维 Java
        💻Java零基础:深入了解Java内存机制
        【10月更文挑战第18天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
        15 1
        |
        3天前
        |
        Java 数据处理 开发者
        Java多线程编程的艺术:从入门到精通####
        【10月更文挑战第21天】 本文将深入探讨Java多线程编程的核心概念,通过生动实例和实用技巧,引导读者从基础认知迈向高效并发编程的殿堂。我们将一起揭开线程管理的神秘面纱,掌握同步机制的精髓,并学习如何在实际项目中灵活运用这些知识,以提升应用性能与响应速度。 ####
        19 3