自定义异常

继承Excetion是定义编译时异常
继承RunntimeExcetion是定义运行时异常
throw:主动抛出异常
throws:方法声明抛出异常,多个异常用、号隔开
自定义异常: 如果想让异常对象在调用printStackTrace方法时,可以有描述信息,就需要加入一个带描述信息的构造方法。示例如下:

/*
 * 自定义运行时异常(编译时异常继承Exception)
 */
public class Over50Exception extends RuntimeException {

	public Over50Exception() {
		super();
		// TODO Auto-generated constructor stub
	}

	//如果想让异常对象在调用printStackTrace方法时,可以有描述信息,就需要加入一个带描述信息的构造方法
	public Over50Exception(String message) {
		super(message);
	}

	
}

/*
 * 自定义异常:定义出来符合自己需求但是Java却没有提供的异常
 * 
 * 区分异常在于异常的类名以及异常的描述
 * 
 * throw:抛出异常
 * 自定义异常定义格式:
 * 		继承Excetion是定义编译时异常    继承RunntimeExcetion是定义运行时异常
 * 
 * 异常的基本操作:
 * 	1:创建异常对象   普通的创建对象
 * 	2:抛出异常对象   使用throw,第二结束表示产生了一个异常
 * 	3:处理异常    
 * 三个步骤均需要自己手动完成
 */
public class Demo07Exception {

	public static void main(String[] args) {
		
		int age = 18;
		if(age<50) {
			try {
				//创建自定义异常对象
				Over50Exception o50E = new Over50Exception("养老保险必须是50岁以上的人关注的内容");
				//手动抛出异常
				throw o50E;
			} catch (Over50Exception e) {
			//这里打印异常信息就会有自己写的描述信息。
				e.printStackTrace();
				System.out.println("异常处理代码:小朋友,你还小,再等两年!至少等个20年!");
			}
		}
		
		System.out.println("aaaa");
		//我们也可以自己手动创建异常对象并抛出
		RuntimeException re = new RuntimeException("我是很无聊的一个异常,我就试试~");
		try {
			throw re;
		} catch (Exception e) {
		//由于RuntimeException是Exception的子类所以这里也会打印出来描述信息。
			e.printStackTrace();
			System.out.println("我处理了你这个无聊的异常!");
		}
		
		System.out.println("bbbb");
	}
}

异常的注意事项:

重点要注意的是:函数中已经出现返回语句返回值A,再在finally中修改A值,则最终的返回值仍为修改前A的值。但在该方法中A的值已经被修改了。如果在finally中再次return A则最终的返回值就是修改后的A值了。下面为示例:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
 * 异常注意事项:
 * 		父类方法没有抛出异常,子类重写父类方法时也不可以抛出异常,但是如果子类又在代码中产生了这个异常,则必须捕获不能声明抛出。
 * 
 * 		函数中已经出现返回语句返回值A,再在finally中修改A值,则最终的返回值仍为修改前A的值。但在该方法中A的值已经被修改了。
 * 		finally是一定会被执行的代码块。与try/catch配合使用
 */
public class Demo08Exception {

	public static void main(String[] args) {
		Zi zi = new Zi();
//		zi.method();
		int finallyReturn = zi.method2();
		System.out.println(finallyReturn);
	}
}

abstract class Fu{
	public abstract void method();
}
class Zi extends Fu {
	//父类方法没有抛出异常,子类重写父类方法时也不可以抛出异常,但是如果子类又在代码中产生了这个异常,则必须捕获不能声明抛出。
	@Override
	public void method() {
		
		//产生异常的准备
		String s = "1949-10-01";
		DateFormat sf = new SimpleDateFormat("yyyy-MM-dd");

		try {
			Date date = sf.parse(s);
		} catch (ParseException e) {
			e.printStackTrace();
		} finally {
			System.out.println("我一定会被执行~");
		}
		
	}
	
	public int method2() {
		//定义返回值
		int i = 100;
		//产生异常的准备
		String s = "1949-10-01";
		DateFormat sf = new SimpleDateFormat("yyyy-MM-dd");

		try {
			Date date = sf.parse(s);
			//返回路径:每次碰到return就会在返回路径中临时存储这个被返回的值,无论方法内有任何的改变,返回路径中的这个值一致不变。
			return i;
		} catch (ParseException e) {
			e.printStackTrace();
		} finally {
			i = 200;
			System.out.println("我一定会被执行~"+i);
		}
		
		System.out.println("异常过后执行其他代码");
		return i;
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值