<图片来自百度;>
对于受检异常在编译阶段必须进行预处理, 预处理方法有两种:
● try…catch捕获处理
● throws抛出处理
try{
/*对可能产生异常的代码进行检视
try代码块中的某条语句一旦产生了异常,程序就立即跳转到catch子句执行, try代码块后面的代码不再执行
try代码块中, 可能会有多条语句有受检异常需要预处理, 可以通过多个catch子句分别捕获*/
}catch( 异常类型1 e1){
/*捕获异常类型1的异常, 捕获了异常,在开发阶段, 一般的预处理方式就是把异常打印到屏幕上, 程序员可以根据异常信息进行程序调试*/
e1.printStackTrace(); //每个异常都有这个方法
}catch( 异常类型2 e2){
/*如果catch子句捕获的异常有继承关系, 如果想单独对异常进行预处理, 应该先捕获子异常, 再捕获父异常, 或者直接捕获一个父异常*/
}finally{
*/finally子句不管是否有异常产生,总是会执行
经常在finally子句中释放系统资源*/
}
案例:
public class Test04 {
public static void main(String[] args) {
FileInputStream fis = null;
try{ //try代码块,对可能产生异常的代码进行检视
fis = new FileInputStream("d:/abc.txt"); //构造方法有受检异常FileNotFoundException需要预处理
System.out.println("在当前程序与指定的文件之间建立了流通道, ");
fis.read(); //read()方法有受检异常IOException需要预处理
System.out.println("从文件中读取了一个字节");
// 通过catch子句捕获产生的异常
}catch (FileNotFoundException e) {
// 捕获文件未找到异常
e.printStackTrace(); //开发时,一般把异常打印到屏幕上
//捕获了产生的异常, 程序没有中断, 还继续向下执行
}catch (IOException e) {
// 捕获IOException异常
// FileNotFoundException 继承了 IOException, 如果需要单独处理, 应该先捕获子异常 ,再捕获父异常
// 或者, 不需要单独处理时, 直接捕获父异常即可
}finally {
System.out.println("finally子句,不管是否产生异常,总是会执行, 经常在finally子句中释放系统资源");
//可以在finally子句中关闭流通道
if ( fis != null ) {
try {
fis.close(); //close()方法有受检异常IOException需要预处理
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("文件读取完后,需要关闭流通道");
}
}
System.out.println("main...end....");
}
}
throws案例:
public class Test06 {
//在定义main()方法时,可以抛出异常, main的异常抛出给JVM
//JVM默认的处理方式: 中断程序, 打印异常信息
// public static void main(String[] args) throws FileNotFoundException {
public static void main(String[] args) {
System.out.println("main方法中调用m1()方法");
try {
m1(); //抛出m1()抛出的异常, 这个异常不会继续上抛了, 程序也不会中断,继续向下执行
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println("main方法结束....");
}
//如果m1()方法 在定义时通过throws声明了一个异常, 就是受检异常, 在调用m1()方法时也需要对该异常进行预处理
//谁调用m1()方法, 谁负责处理该异常
private static void m1() throws FileNotFoundException {
System.out.println("m1方法开始执行, 调用了m2()方法 ");
m2(); //在调用m2()方法, 需要对m2()的受检异常进行预处理
System.out.println("m1方法结束 ......");
}
//在定义方法时, 如果方法体中的某条语句有受检异常需要预处理, 可以捕获处理, 还可以抛出处理
//在方法的定义位置通过throws关键字声明抛出异常, 在m2()定义时通过throws声明的异常 就是受检异常
//谁调用m2()方法, 谁负责处理该异常
private static void m2() throws FileNotFoundException {
System.out.println("m2方法调用 FileInputStream类的构造方法");
FileInputStream fis = new FileInputStream("d:/abc.txt"); //构造方法有受检异常需要预处理
System.out.println("m2.结束");
}
}
自定义异常;
package com.hao.se
//1) 定义一个类继承Exception
public class AgeOutOfBoundsException extends Exception {
//2) 一般提供两个 构造方法
public AgeOutOfBoundsException() {
super();
}
//带有字符串参数的构造方法, 这个字符串是异常信息
public AgeOutOfBoundsException(String message) {
super(message);
}
}
package com.hao.se
public class Person {
private String name;
private int age;
private String gender;
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
//4) throw语句所在的方法通过throws 声明该异常
public void setAge(int age) throws AgeOutOfBoundsException {
//必要时,在setter()方法中,对参数接收的数据进行合理 性验证
if ( age >= 0 && age <= 130) {
this.age = age;
}else {
//年龄不合理 , 抛出一个异常
//3)在需要的位置,通过throw抛出一个异常对象
throw new AgeOutOfBoundsException("年龄越界");
}
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
package com.hao.se
/**
* 测试自定义异常
* @hao
*
*/
public class Test {
public static void main(String[] args) {
/* //创建Person对象
Person lisi = new Person();
//直接给lisi的各个字段赋值 , 可能会赋值一些无效的值
lisi.name = "lisi";
lisi.age = 188888; //没有语法错误, 没有意义,赋的值无效, age表示一个人的年龄
lisi.gender = "男";
System.out.println( lisi );*/
//对字段进行封装后
Person lisisi = new Person();
lisisi.setName("lisis");
//5)对受异常进行预处理
try {
lisisi.setAge( 188888 );
} catch (AgeOutOfBoundsException e) {
e.printStackTrace();
}
lisisi.setGender("妖");
System.out.println( lisisi );
}
}