Java基础之异常(四)

在这里插入图片描述
<图片来自百度;>

对于受检异常在编译阶段必须进行预处理, 预处理方法有两种:

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

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天至少八杯水i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值