JavaSE—异常处理深入了解(一)

简介: JavaSE—异常处理深入了解(一)

                 


                           📌 Java异常概述

○ 异常的概念:

•  程序在运行过程中出现的不正常情况

  例如用户输入数据有问题,读写文件时文件被强制删除了,网络传输过程中突然断网...

•  出现异常后,会导致jvm(虚拟机)停止运行,后续程序无法执行.

○ 注意:

•  异常指的并不是语法错误. (语法错误,编译不通过,不会产生字节码文件,根本不能运行)

○ 异常的抛出机制 :

java中把不同的异常用不同的类表示, 一旦发生某种异常, 就创建该异常类型的对象, 并且抛出;

然后程序员可以捕获到这个异常对象, 并处理; 如果没有捕获这个异常对象, 那么这个异常将会

导致程序终止。

○ java中默认的异常处理机制:

  • 将出现的异常,按不同的类型分类,为每种异常封装了一个类来进行标识.
  • 当出现某种类型的异常情况时,会抛出此类的对象,然后终止虚拟机的运行.

异常信息:

•  异常的类型 (在哪种情况下出现,结合API定位)         • 异常原因           • 异常位置


                       📌 Java异常体系结构


○ java.lang.Throwable  : 异常体系的超类

 Error 错误:

  • 是虚拟机和Java代码无法解决的问题,例如虚拟机内部异常,内存不够用了.
  • 堆溢出: OutOfMemoryError
  • 栈溢出: StackOverflowError

 Exception 异常:

  • 这类异常时可以通过异常处理机制进行处理的一般性问题.

                       


                              📌 常见的异常

ArithmeticException                                  算术异常


ArrayIndexOutOfBoundsException         数组索引越界

StringIndexOutOfBoundsException        字符串索引越界


ClassCastException                                  类型转换异常


NumberFormatException                          数字格式化异常


NullPointerException                                 空指针异常

代码演示:

public static void main(String[] args) {
        /* 
        int a = 10;
        int b =0 ;
        System.out.println(a/b);
        System.out.println("*****"); 
        */  //ArithmeticException 算术异常
 
       /* 
        int[] c=new int[2];
        c[3] = 0; 
        */   //ArrayIndexOutOfBoundsException 数组索引越界
 
       /* 
       String s = "abc";
        s.charAt(4);
        */   //StringIndexOutOfBoundsException 字符串索引越界
 
        /* 
        Object o = new Integer(10);
        String so = (String) o;
        */  //ClassCastException 类型转换异常
 
        /* 
        Integer.parseInt("abc"); 
        */  //NumberFormatException 数字格式化异常
 
        /*
        String ss = null;
        ss.length(); 
        */  //NullPointerException 使用null中的方法称为空指针异常      
    }

                           

       📌 异常处理

⦁  Java中使用异常处理机制为程序提供了错误处理的能力


⦁  在编码时,就针对可能出现问题的代码,预先编写一些处理机制,当程序运行出现异常时执行处理机制,之后继续执行后续的程序。



●  Java的异常处理是通过5个关键字来实现的:trycatchfinallythrowthrows .

try{...}catch(){...}

try{

 编写可能出现异常的代码

}catch(异常类型){  

 处理机制  

}  

代码演示:

 public static void main(String[] args) {
        int a =10;
        int b = 0;
        try{
            int c = a/b;
        }catch (ArithmeticException aindex){
            aindex.printStackTrace();  //打印异常信息到控制台
            /* 一般在开发调试阶段使用,供开发人员定位异常问题 */
            System.out.println("算术异常");
        }
    }

运行结果:


一个try代码块可以对应多个catch

public static void main(String[] args) {
        try {
            String s =null;
            s.length();
 
            int num =Integer.parseInt("1a");
 
            int[] b =new int[5];
            for (int i = 0; i <=b.length ; i++) {
                System.out.println(b[i]);
            }
        } catch (ArrayIndexOutOfBoundsException aindex) {
            aindex.printStackTrace();//打印异常信息
            System.out.println("数组索引越界,越界索引:"+aindex.getMessage());
            //getMessage()得到异常原因
        }catch (NumberFormatException nex){
            nex.printStackTrace();
            System.out.println("数字格式化异常:"+nex.getMessage());
        }catch (Exception e){//在具体捕获类型后catch Exception,可以捕获任意类型,但是必须放在最后面
            e.printStackTrace();
            System.out.println("系统繁忙~请稍后再试!");
        }
        System.out.println("继续执行后续程序");
 
    }

当我们不确定捕获类型时可以使用Exception, Exception可以捕获任意类型, 但是需要放在具体捕获类型后catch. 否则放到首部会覆盖其他具体的捕获类型。


finally{...}


   finally块中的内容总是会执行的, 且只能有一个finally语句.


try{  

 编写可能出现异常的代码

}catch(异常类型){

 处理机制  

}finally{

 代码总能执行  

}

○ 使用finally的两种情形:

  • 当catch错误, 异常没有被捕获到, 后面的代码无法执行, 但finally中的代码是可以执行的
 public static void main(String[] args) {
        int[] a = new int[5];
        try {
            for (int i = 0; i <= a.length; i++) {
                System.out.println(a[i]);
            }
        }catch (NumberFormatException nex){
            nex.printStackTrace();
            System.out.println("数字格式化异常:"+nex.getMessage());
        }finally {
            System.out.println("继续执行后续程序");
        }
    }
  • 确保在出现异常的情况下 依然最终把流对象关闭掉
public static void main(String[] args) throws IOException {
       
        FileInputStream inputStream =null;
        try{
            inputStream =new FileInputStream("F:/demo.txt");
                    //文件若找不到,就会出现异常
        }catch (FileNotFoundException e){
            e.printStackTrace();
            System.out.println("文件找不到异常");
        }finally {
            //确保在出现异常时,仍然可以把流对象关闭掉
            if (inputStream!=null){
                inputStream.close();
            }
        }
    }

                                                                                                                        其余内容敬请期待...

相关文章
|
8天前
|
SQL 存储 NoSQL
贝壳找房基于Flink+Paimon进行全量数据实时分组排序的实践
本文投稿自贝壳家装数仓团队,在结合家装业务场景下所探索出的一种基于 Flink+Paimon 的排序方案。这种方案可以在实时环境对全量数据进行准确的分组排序,同时减少对内存资源的消耗。在这一方案中,引入了“事件时间分段”的概念,以避免 Flink State 中冗余数据对排序结果的干扰,在保证排序结果准确性的同时,减少了对内存的消耗。并且基于数据湖组件 Paimon 的聚合模型和 Audit Log 数据在数据湖内构建了拉链表,为排序结果提供了灵活的历史数据基础。
28360 0
贝壳找房基于Flink+Paimon进行全量数据实时分组排序的实践
|
1天前
|
存储 缓存 Java
JavaSE—IO流 ( 八千字带你快速深入理解IO流体系 )(二)
JavaSE—IO流 ( 八千字带你快速深入理解IO流体系 )(二)
|
1天前
|
存储 安全 网络安全
云端防御:云计算时代的网络安全新策略
【6月更文挑战第30天】随着云计算的普及,企业和个人越来越依赖于云服务来存储和处理数据。然而,这种依赖也带来了新的安全挑战。本文将探讨在云计算环境中维护网络安全的重要性,分析云服务中常见的安全威胁,并提出一系列创新的安全策略和技术解决方案。通过这些措施,我们可以更好地保护云计算资源,确保信息安全。
|
1天前
|
存储 安全 Java
使用SimpleDateFormat进行日期格式化
使用SimpleDateFormat进行日期格式化
|
1天前
|
机器学习/深度学习 传感器 边缘计算
探索机器学习在图像识别中的应用
【6月更文挑战第30天】在数字时代的浪潮中,机器学习技术正以前所未有的速度改变着我们的生活和工作方式。特别是在图像识别领域,机器学习的应用不仅推动了技术的边界,还为各行各业带来了革命性的变革。本文将深入探讨机器学习在图像识别中的核心技术、实际应用案例以及面临的挑战与未来的发展方向,旨在为读者提供一个全面而深入的视角,理解这一领域的创新动态及其对社会的深远影响。
|
1天前
|
存储 安全 Java
JavaSE—集合(零基础讲解完整版)
JavaSE—集合(零基础讲解完整版)
|
1天前
|
存储 Java
JavaSE—IO流 ( 八千字带你快速深入理解IO流体系 )(一)
JavaSE—IO流 ( 八千字带你快速深入理解IO流体系 )(一)
|
1天前
|
存储 NoSQL Java
使用Java实现分布式文件系统
使用Java实现分布式文件系统
|
1天前
|
Java 索引
JavaSE—常用类 (全)(一)
JavaSE—常用类 (全)(一)
|
1天前
|
存储 JSON JavaScript
使用JSONObject解析与生成JSON数据
使用JSONObject解析与生成JSON数据