自定义异常类

复习:
内部类类别:
成员内部类
在一个类的成员位置定义另一个类,那么另一个类即成为成员内部类
成员内部类的访问方式:
方法一、在外部类中提供一个方法创建内部类的对象进行访问
方法二、在其他类创建内部类的对象进行访问
创建的格式是:外部类.内部类 变量名 = new外部类().new 内部类();
注意:如果是静态内部类的访问方式,外部类.内部类 变量名 = new 外部类.内部类();
成员内部类要注意的事项:
1.成员内部类可以直接访问外部类的成员
2.如果成员内部类与外部类存在同名的成员,在内部类中默认是访问内部类的成员
成员通过“外部类.this.成员”指定访问外部类的成员
3.如果成员内部类出现了静态的成员,那么该成员内部类也必须使用static修饰
4.如果成员内部类是私有的,那么创建内部类的对象就只能在外部类提供方法创建

局部内部类:
在一个类的方法内部定义另外一个类,另外一个类就称为局部内部类
局部内部类要注意的是:如果局部内部类访问了局部变量,那么该变量需要使用final修饰(原因:因为生命周期不一致,所以内部类访问的局部变量其实是一个复制品)

匿名内部类:
没有类名的类
匿名内部类的好处是简化书写
匿名内部类的使用前提是必须是继承或者实现的关系
匿名内部类的格式`

new 父类(或者父接口){
	匿名内部类的成员
};`

异常:
异常的体系:

-------Throwable
------------Error(错误)错误一般是由jvm或者硬件导致的问题,所以我们一般不会通过代码去处理
------------Exception(异常)异常我们一般都会通过代码去处理
异常的处理方式

方式一、捕获处理
捕获处理的格式

	try{
		有可能异常的代码
	}catch(捕获的异常的类型 变量名){
		处理异常的代码
	}
	

捕获处理要注意的细节:
1.如果一个try块中出现了异常的代码,经过处理之后,那么try-catch块外面的代码可以正常执行了
2.如果一个try快中出现了异常的代码,那么在try块中出现异常的代码后面的代码无法执行
3.一个try块后面可以跟多个catch块,也就是一个try块可以捕获多种异常的类型,但是捕获的类型必须从小到大进行捕获

方式二、抛出处理(throw----throws)
1.如果一个方法内部抛出了一个编译时异常对象,那么该方法必须声明抛出
2.如果调用了一个声明抛出编译时异常的方法,那么调用者必须要处理
3.如果一个方法抛出了一个异常对象,那么该方法也会马上停止(一个方法遇到了throw关键字,那么该方法就会马上停止)
4.在一种情况下只能抛出一种异常对象

throw关键字使用在方法体之内抛出异常对象的,throws关键字是用于方法声明上声明抛出异常类型的

sun提供了很多的异常类给我们用于描述程序中的不正常情况,但是sun给我们提供异常类还不足以描述我们现实生活中所有不正常的情况,那么这时候我们就需要自定义异常类

需求:模拟QQ上线的时候,如果没有插上网线,那么就抛出一个没有插上网线的异常,如果已经插上了网线,那么就正常显示好友列表
那么就需要我们有一个没有插上网线的异常类对象,可是java中并没有这种异常类,

自定义异常类的步骤:自定义一个类继承Exception即可

//自定义一个没有网线的异常类了
class NoIpException extends Exception {
	public NoIpException(String message) {
		super(message);//调用了Exception中一个参数的方法
	}
}

public class Demo7 {
	public static void main(String[] args) throws NoIpException{
		String ip = "192.168.10.100";
		ip = null;
		feiQ(ip);
		/*捕获处理
		try {
			feiQ(ip);
		} catch (NoIpException e) {
			e.printStackTrace();
			System.out.println("插上网线");
		}
		*/
	}

	public static void feiQ(String ip) throws NoIpException {
		if (ip == null) {
			throw new NoIpException("没有插网线啊,小白");
		}
		System.out.println("正常显示好友列表");
	}
}

需求:模拟你去吃木桶饭,如果带钱少于了10块,那么就抛出一个没有带够钱的异常对象,如果带够了,可以吃上香喷喷的地沟油。。。。

class EatException extends Exception{
	public EatException(String message){
		super(message);
	}
}

public class Demo8 {
	public static void main(String[] args)throws EatException {
		int money = 20;
		money = 2;
		eat(money);
	}
	
	public static void eat(int money)throws EatException{
		if(money<10){
			throw new EatException("钱没带够啊,朋友");
		}
		System.out.println("吃上了香喷喷的地沟油。。。");
	}
}

异常的体系:

-------Throwable
------------Error(错误)错误一般是由jvm或者硬件导致的问题,所以我们一般不会通过代码去处理

------------Exception(异常)异常我们一般都会通过代码去处理
-----------------运行时异常:如果一个方法内部抛出了一个运行时异常对象,那么方法上可以声明也可以不生命,调用者可以处理也可以不处理
-----------------编译时异常(非运行时异常、受检异常):如果一个方法内部抛出了一个编译时异常对象,那么方法上就必须要声明,而且调用者也必须要处理

运行时异常:RunTimeException以及RunTimeException子类 都属于运行时异常
编译时异常:除了运行时异常就是编译时异常
如果不知道该异常是否为那种异常,可以去API文档里搜索,或者声明并处理也都是可以的,但是注意编译时异常必须声明,处理

疑问:为什么java编译器会如此严格要求编译时异常,对运行时异常如此宽松?
运行时异常都是可以通过程序员良好的编程习惯去避免,所以java编译器就没有严格要求必须处理运行时异常

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值