一、捕获异常
1、异常的理解:异于平常,本来一件事情正常执行,可能中途会有特殊情况,导致当前事情无法正常执行而影响执行结果,这个中途特殊情况即异常。在程序中,程序运行过程中的意外情况
例如:a/b这个操作,正常情况是没有任何问题,但是隐藏了一个问题,如果b为0,则这个除法操作将无法执行,则b为0的情况属于a/b这件事情的异常情况
package com.test.exercise6;
public class ExceptionTest {
/**
* @param args
*/
public static void main(String[] args) {
new ExceptionTest().add(10, 0);// 如果这里第二个参数为0,则会报错
}
/**
* b不能为0
*
* @param a
* @param b
* @return
*/
public int add(int a, int b) {
return a / b;
}
}
出现错误:
这就是异常的例子。
2、异常处理机制特点:Java异常处理是面向对象处理方式
一旦代码出现异常问题,JVM(Java虚拟机)底层则会创建一个异常类相关的对象,异常对象产生后,会根据代码对异常的处理机制进行操作,其中异常处理机制包括捕获异常和抛出异常两种,如果没有异常操作,则java程序会中断执行
3、为什么要处理异常:异常在程序中如果不做处理,会导致程序中途瘫痪,不能正常完成特定功能
4、如何处理异常:1)检测性(非运行时)异常特点:直接继承于Exception这个类,必须要处理,不处理,编译不通过
2)非检测(运行时)异常特点:直接继承于RuntimeException这个类,可以不处理,但是运行时候可能会抛异常出来
注意:finally代码块:是异常的统一出口,所有程序代码流程必然会走finally执行,但是finally可以不写
捕获异常格式:
try{
//可能出现异常的代码部分
}catch(异常类型 异常变量){
//执行异常操作
}catch(异常类型 异常变量){
//执行异常操作
}…
finally{
//处理完try与catch操作后的收尾操作,异常统一出口
}
一般情况下:
try{
//可能出现异常的代码部分
}catch(Exception e){//这样就不用担心捕获的异常不准确,也不用写很长的代码了(仅仅限于运行时异常的捕获)
//执行异常操作
}
异常捕获注意事项:
1、catch定义,由上到下,异常类的范围必须由小到大或者同级别的
2、
(i)运行时异常,catch中可以随意定义类型,程序运行时,会根据catch参数自动匹配
(j)非运行时异常,则在catch中定义的异常在try代码块中必须存在,如果没有类似异常存在,则不允许被定义
3、finally关键字,在进行异常处理之后,在异常的处理格式中还有一个finally语句,此语句将作为异常的统一出口,不管是否产生异常,最终都要执行此段代码
4、如果try中有return语句,则会先执行return语句,后执行finally,最后返回整个方法。
例子:
package com.test.exercise6;
public class ExceptionTest {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(new ExceptionTest().add());
}
/**
* b不能为0
*
* @param a
* @param b
* @return
*/
public int add() {
int a = 20, b = 10, result = 0;
System.out.println("执行了add");
try {
result = a / b;
return add2();// 先执行这条return语句
} catch (Exception e) {
System.out.println("执行到这儿了");
} finally {
System.out.println("执行了finall");// 再执行finally语句
}
return result;// 返回这个方法
}
public int add2() {
System.out.println("执行了add2");
return 1;
}
}
结果:
异常的继承体系
二、抛出异常
1、throws:此异常主要是针对存在异常的代码块出现的异常问题,中止当前方法的执行;此方法把异常问题抛出给调用此方法的上一级函数当中,并调用出自行处理异常
例子:
package com.test.exercise6;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class ExceptionTest {
/**
* @param args
* @throws FileNotFoundException
*/
public static void main(String[] args) throws FileNotFoundException {
ExceptionTest et = new ExceptionTest();
et.add();
System.out.println("OK3");
}
/**
*
*
*
*
*
* @throws FileNotFoundException
*/
public void add() throws FileNotFoundException {
System.out.println("OK");
FileInputStream file = new FileInputStream("text");// 执行到这里,中断了,后面的代码都没有运行
System.out.println("OK2");
}
}
结果:
1)格式:方法后面添加:throws异常类型
public void test() throws 异常类型{
//存在异常的代码块
}
2)说明:方法抛出异常后,异常就会丢给调用这个方法的那一行代码
(i)如果抛出的异常是检测性异常:则调用这行代码的方法必须要处理(捕获,抛出)
(j)如果抛出的是非检测性异常:则调用这行代码的地方可以选择性处理
2、throw: 此操作主要是对当前产生的异常对象进行抛出操作;常用的处理格式是结合try...catch和throws一起使用,在异常块的catch里面处理的
public void test() throws 异常对象类型{
try{
//存在异常的代码块
}catch(异常类型 变量名){
throw 异常对象;
}
}
说明:如果在catch中使用了throw,一般的情况下在方法上必须要使用throws
注意:
(1)throw一般存在于catch语句当中,用于出现异常后的一种操作方式
(2)捕捉的异常和抛出的异常不一定相同,可以不一样
(3)throw抛出的异常对象如果是检测异常,则所在的方法必须要通过throws显性抛出
(4)throw抛出的异常对象如果是非检测异常,则方法上可以选择性定义throws
三、自定义异常:一般是自己定义一个类来扩展Exception类
1、格式:public class 自定义异常类名 extends Exception{}
2、自定义异常一般适用于throw代码块抛出
File类是java中提供给程序操作硬盘文件的方式,可以来获取当前关联硬盘文件的相关属性,包括文件名、路径、大小、修改日期等。
注意:File类不能直接读写文件中的内容,只能查看和操作文件本身