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;