10.8异常

学习内容:

异常, 数组, 常用类, 集合, IO流, 线程, 反射, 网络编程

1 类与类之间的关系

类与类之间的关系: 泛化(继承), 实现, 依赖, 关联, 聚合, 组合
1)泛化
就是继承, 子类继承父类, 子接口继承父接口
2)实现
一个类实现了某个接口
3)依赖
在A类中, 使用B类作为方法的返回值类型, 作为方法的形参类型, 作为局部变量的类型, 称A类依赖B类
4)关联
在A类中,使用B类定义了成员变量, 称A类关联B类
5)聚合
聚合是关联的一种, A类由若干的B类组成,但是A类不能决定B类的生命周期, 称A是由B聚合而成
6)组合
是关联的一种, A类由若干B类组成, A类可以决定B的生命周期

类与类之间的关系:
is a , 子类 is a 父类, 是一种继承关系, 父类是通用类(一般类),子类是特殊类, 也只有符合is a 关系的两个类才可以使用继承
like a , 类 like a 接口, 是一种实现关系
has a, A类 has a B类, 是一种关联关系

2 内部类

可以在A类的类体中定义一个B类, 称B类为内部类, 称A类为外部类
内部类编译之后也会生成单独的字节码文件: 外部类名$内部类名.class
内部类分为:
成员内部类, 静态内部类, 局部内部类, 匿名内部类

class  A{
	//成员内部类
class   B1 {}

//静态内部类

static  class  B2{}
void   method1 () {
//局部内部类
class  B3{}
   }
}

2.1 成员内部类

是属于某个外部类对象的

class  Outer{
	int  xx = 10 ; 			//实例变量
	class   Inner{} 		//成员内部类
}

2.2 静态内部类

class  Outer{
	static  int  xx = 10 ; 			//静态变量
	static  class   Inner{} 			//静态内部类
}

2.3 局部内部类

class  Outer{
	public  void  m1(){
	int  xx = 123;				//局部变量
	class  Inner{};				//局部内部类
	}
}

2.4 匿名内部类

匿名内部类就是没有类名的内部类
匿名内部类的定义与匿名内部类对象的创建是一起的

应用场景:
当某个成员内部类只使用一次时, 可以使用匿名内部类

抽象类的引用/接口引用可以指向匿名内部类对象

3 异常
3.1 异常概述
异常就是在程序的运行过程中出现的不正常现象.

之前遇到的异常:
空指针异常: NullPointerException
类型转换异常: ClassCastException
算术异常: ArithmeticException
在Java中, 对出现的异常现象使用类进行描述, 异常相关的类:

什么是受检异常?
在方法定义时, 通过throws声明抛出的异常就是受检异常. 在调用方法时,必须对这个受检异常进行预处理,否则编译报错.

3.2 异常处理
3.2.1 try…catch捕获处理
语法:

 try{
可能产生异常的代码块
如何代码块中的某条语句产生了异常, 立即跳转到对应的catch子句执行, 这条语句后面try代码块不再执行
代码块中可能会产生多个异常, 可以通过多个catch子句进行分别捕获处理
}catch( 异常类型1  e1){
对异常类型1的异常进行处理
} catch( 异常类型2  e1){
对异常类型2的异常进行处理
在开发时,一般的处理方式就是把异常栈的跟踪信息打印到屏幕上; 部署后,一般把异常打印到日志文件中.
}finally{
不管是否产生异常, finally子句总是会执行
一般在finally子句中用来释放系统资源
}

try…catch…finally中的各个子句都不能单独使用, 可以是try…catch…, 可以是try…finally, 也可以是try…catch…finally.

final,finalize, finally的区别
3.2.2 throws抛出
语法:

	[方法修饰符]  返回值类型  方法名(参数列表)     throws  异常类型{
	方法体
	}

throws与try…catch的选择?
1)如果作为方法的调用者, 被调用的方法声明抛出了异常, 一般进行try…catch捕获处理
2)如果作为方法的定义者, 在方法体中,可以throw抛出一个异常对象, 方法声明位置需要通过thorws声明抛出一个异常, 提醒当前方法的调用者,可能会出现异常.
3)作为方法的定义者, 如果在方法体中调用了其他方法, 被调用的方法有异常抛出, 也可以在方法的声明位置继续声明抛出该异常, 谁调用谁处理

3.3 方法覆盖中的异常
方法覆盖的原则:
1)方法签名(方法名与参数列表)必须一致.
2)方法的返回值类型, 如果不是引用类型也必须相同, 如果是引用类型, 子类方法的返回值类型可以是父类方法返回值类型的子类型.
3)子类方法的访问权限可以比父类方法的访问权限更宽泛.
如果父类方法使用public修饰,子类方法只能使用public修饰
如果父类方法使用protected修饰,子类方法可以使用protected/public修饰
如果父类方法没有访问权限修饰符,子类和父类如果在同一个包中, 子类方法可以使用protected/public修饰,也可以没有权限修饰符; 如果子类和父类不在同一个包中, 不能覆盖.
如果父类方法使用private修饰, 不能覆盖
4)如果父类方法没有声明抛出异常, 子类方法也不能声明抛出异常; 如果父类方法声明抛出了异常,子类方法可以声明抛出相同的异常, 也可以声明抛出父类方法异常的子异常, 也可以不抛出异常

3.4 异常在开发中的实际应用
自定义异常
1)定义一个类继承Exception
2)提供两个构造方法
3)通过throw抛出一个异常对象
4)throw所在的方法通过throws声明一个异常
5)调用方法时,对异常进行处理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值