Java异常的处理(超详细)

java异常

前言:

在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的。

本章将会学习到

编译异常

运行异常

异常的处理try-catch

异常基本介绍

基本概念

java语言中,将程序执行中发生的不正常情况称为"异常".(开发过程中的语法错误或者逻辑错误不算异常)

执行过程中所发生的的异常可以分为两大类

1.Error(错误):java虚拟机无法解决的严重问题.如:jvm系统错误,资源耗尽等严重问题,比如栈的溢出属于严重错误,程序会崩溃

2.Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用指定的代码去快速定位

常见的运行异常

1.NullPointerException空指针异常

2.ArithmeticException数学运算异常

3.ArrayIndexOutOfBoundsException数组下标越界异常

4.ClassCastException类型转换异常

5.NumberFormatException数字格式不正确

编程异常

编程异常是在编译期间,就必须处理的异常,否则代码不能通过编译

常见的编译异常

SQLException 操作数据库时,查询表可能发生异常

IOExcepiton 操作文件时,发生的异常

FileNotFoundException当操作一个不存在的文件时,发生异常

ClassNotFoundException 加载类,而该类不存在时,异常

EOFException 操作文件,到文件末尾,发生异常

IIIegalArguementException 参数异常

异常处理

异常处理就是对异常处理的方式.

异常处理的方式

1.try-catch-finally

2.throws + 异常类型

Java提供的是异常处理的抓抛模型。
过程一:Java程序的执行过程中如出现异常, 会生成一个异常类对象,该异常对象将被提交给Java运行时系统, 这个过程称为抛出(throw)异常。
过程二:抓,可以理解为异常的护理方式。

异常对象的生成
由虚拟机自动生成:程序运行过程中,虚拟机检测到程序发生了问题,如果在当前代码中没有找到相应的处理程序,就会在后台自动创建一个对应异常类的实例对象并抛出——自动抛出
由开发人员手动创建: Exception exception = new ClassCastException();——创建好的异常对象不抛出对程序没有任何影响,和创建一个普通对象一样。

异常是如何抛出的?

main->function01->function02(异常函数位置)

遇到异常后 function02->function01->main

为了保持整个程序的正常处理,所以必须对代码进行异常处理

try catch 语法

try{
可能会异常的代码
}
cath(ExceptionNum1 e){
当产生ExceptionNum1异常会在这里进行处理  比如打印异常/比如输出对应的信息,"你错了还不快改!!"
}
catch(ExceptionNUm2 e){
当产生ExceptionNum2异常会在这里进行处理  比如打印异常/比如输出对应的信息,"你错了还不快改!!"
}finally{
无论上面是否会产生异常都会执行的代码
}

像数据库连接,输入输出流,网络编程socket等资源,JVM是不能自动回收的,我们需要手动的进行资源的释放。此时的资源的释放,就需要声明在finally中。

如果知道指定的错误类型(数学运算错误…) 可以使用指定的错误类型,也可以使用所有异常的父类

Excption 去作为参数

throws +异常类型

声明抛出异常是Java中处理异常的第二种方式
throws +异常类型,写在方法的声明处,此时此方法执行时, 可能会抛出的类型。
如果一个方法(中的语句执行时)可能生成某种异常, 但是并不能确定如何处理这种异常, 则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
在方法声明中用throws语句可以声明抛出异常的列表, throws后面的异常类型可以是方法中产生的异常类型, 也可以是它的父类。
一旦方法体执行时,出现异常,仍会在异常代码处,生成一个异常类的对象,此对象满足throws后异常类型是,就会被抛出。异常代码后续的代码,就不在执行。
throws的方式只是将异常抛给了方法的调用者,并没有真正将异常处理掉。

比如说当我们去读文件可能会产生文件 FileNotFoundException类型的异常

    public void method() {
          try {
              test3();
          } catch (FileNotFoundException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }
     }
     
     @Test
     public void test3() throws  FileNotFoundException,IOException {
          File file =new File("heool.txt");
          FileInputStream fis = new FileInputStream(file);
          
          int data = fis.read();
          while(data != -1) {
              System.out.println((char)data);
              data = fis.read();
          }
          fis.close();
     }
}

那么何选择try-catch和throws

如果父类中被重写的方法中没有throws方式处理异常,则子类重写的方法中也不能使用throws,意味如果子类重写的方法中有异常,必须使用try-catch。
执行的方法a中,先后又调用了另外的几个方法,这九个方法是递进关系执行的,我们建议这几个方法使用throws的方式进行处理。而执行的方法a可以考虑使用try-catch

手动抛出异常
java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出, 也可根据需要使用人工创建并抛出。
首先要生成异常类对象, 然后通过throw语句实现抛出操作(提交给Java运行环境)。
IOException e = new IOException();
throw e;