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();
            }
        }
    }

                                                                                                                        其余内容敬请期待...

相关文章
|
Java
JavaSE 异常之自定义异常
JavaSE 异常之自定义异常
58 0
|
自然语言处理 Java 编译器
【javaSE】 方法的使用
【javaSE】 方法的使用
|
7月前
|
Java UED
JavaSE&异常
JavaSE&异常
28 1
|
监控 Java 程序员
|
机器学习/深度学习 自然语言处理 Java
【JavaSE】方法的使用
【JavaSE】方法的使用
|
机器学习/深度学习 Java
【JAVASE】什么是方法
【JAVASE】什么是方法
|
Java 程序员
JavaSE 异常
JavaSE 异常
41 0
|
Java 程序员
JavaSE/异常
JavaSE/异常
|
Java 数据安全/隐私保护
JavaSe-异常
JavaSe-异常
|
Java 程序员 数据库
【JavaSE】学习异常
【JavaSE】学习异常