当前位置 : 主页 > 编程语言 > c++ >

java基础笔记(十七)

来源:互联网 收集:自由互联 发布时间:2021-07-03
gistfile1.txt 十年饮冰 难凉热血田林哥哥复习:修饰符:内部类可以声明为抽象类,因此可以被其他的内部类继承,也可以声明为final;初始化块只能为默认或者static;内部类和方法可以加所
gistfile1.txt
十年饮冰 难凉热血
田林哥哥
复习:
修饰符:
内部类可以声明为抽象类,因此可以被其他的内部类继承,也可以声明为final;
初始化块只能为默认或者static;
内部类和方法可以加所以修饰符;
属性除了abstract,都可以;
类只能用public,默认,final和abstract修饰

异常:
为了保证程序的健壮性(不要让来自程序内部的问题和外部资源的问题影响程序的运行)。
不要指望你的代码永远不会出错,一个具有健壮性的程序不是不出错,而是尽量通过修改代码解决运行时异常,对于可能出现的编译时异常提供预处理方案,不让可能出现的异常影响程序的继续执行。

异常的层次关系:
java中出错有两种,一种是error,解决不了;另一种是Exception,它是所有异常的父类,它又分RuntimeException(运行时异常)和IOException(资源异常);

异常相关关键字及其作用:

throws:声明不处理某种异常,抛给调用它的方法
子类覆盖方法声明不处理的异常,必须和父类该方法声明不处理的异常相同,或者是其的子类;

Try:有可能产生问题的代码用try保住
	如果在程序运行中,try块中哪一个语句出了问题,try块中该语句之后的代码都不执行,所以尽量try块细分;

Catch(异常类型):用于try块后,拦截出现的对应的异常对象,一旦一个catch执行,下面的catch就不在捕获,所以尽量把可能出现的异常放在上面,最下面用Exception收底;

Finally:不管正常流程还是异常流程,在返回以前必须执行finally,一般用其来关闭执行时连接的资源
finally中尽量不要有return语句,因为它会覆盖正常执行的返回值,甚至try块中抛出异常再到catch块中产生了新的异常要再次抛出的时候会被finally的return语句隐藏;
返回值栈:后入先出


当出现异常时,发生了什么:
出现异常时,先到当前方法A中找try/catch;如果有,就在当前方法处理;如果没有,在看当前方法是否声明不处理该类异常,如果用throws声明了,那就把异常抛给调用它的方法B;方法B接收到异常的时候,看语句是否有try/catch,如果有,那就处理,没有再看方法B是否声明不处理该异常.....如果到了main方法,依然没有方法catch住这个异常然后处理,那程序就会终止执行;

新姿势:

throw  new  FileNotFoundException(“提示的异常信息”);//创建一个新异常然后抛出;

throw(出现异常)和throws(免责声明):
都是处理异常的关键字;
throws是出现在方法后,声明不处理的一个或者多个异常类,表示本方法不处理这些异常类的对象;
throw是系统自动产生异常抛出,或者手动创建异常对象然后抛出,只能在方法中出现,后面只能加一个异常对象,表示创建一个异常对象,然后抛出。
如果一个方法产生了异常,那就在本方法里找处理异常的代码,如果没有,那再看方法是否声明不处理这些异常,如果声明了,就抛到调用该方法的方法中。

Exception类的数据结构:
属性空间:message,调用异常类的构造方法要传递的字符串
方法空间:
getMessage();//取得异常信息;
toString();//显示异常对象的类型:message属性的值
PrintStackTrace();//先默认调用toString(),显示异常所出现的类,方法和代码语句的位置,方便找到异常出现的位置
利用Exception的printStackTrace()来追踪异常出现的异常栈/方法栈情况

自定义异常:
继承Exception,设计两个构造方法:类里包含一个默认不带参数的构造方法和一个带参数的构造方法(传递详细的出错信息)
PS:public XXException(String message){
	Super(message);//调用父类的有参的构造方法
}

异常栈/方法栈:执行主方法,主方法里调用method1,这就把主方法压到栈底了,然后是method1;在method1中调用method2,再把method2入栈.....所以栈中,自底而上分别是:main,method1,method2,method3,method4;
如果method4出现了异常,本方法中没有处理异常的代码,且method4声明了不处理该类型异常,那就抛到method3....method2....mthod1...main,直到哪一层方法有处理该异常的语句;main要是还没处理异常的代码,那就终止程序。
尽量把处理异常的代码放在可能出现的方法中,不然一层一层抛会影响运行效率

处理异常的原则:
异常一旦捕获,必须要处理;
try块不要过大,不要放没问题的代码,尽量细化;
一个try要对应多个catch,每个catch要和可能出现异常的类型对应,成金字塔型,用exception保底
如果有资源需要关闭,就用finally,但finally中尽量不要放return

PS:运行时异常可以不在方法后用throws声明不处理,系统会自动抛出
测试程序和建模程序都是没有任何可利用的价值的,用完就扔。
业务层和持久层都不要处理异常,都抛给表示层处理



项目结构:

表示层:com.cx.bank.test  
类:TestBank
作用:接收用户请求,调用业务层处理请求,显示结果

业务层:com.cx.bank.manager 
类:ManagerInterface业务层接口,ManagerImp业务层实现
作用:完成用户请求的功能实现
存款,取款,查余额..

持久层:com.cx.bank.dao
类:dao接口,dao实现
作用:封装对存取设备(数据库等)的操作

模型层:com.cx.bank.model
作用:用模型(单例)封装数据

工具层:com.cx.bank.util
作用:为项目提供工具组件
存款为负数的异常类;取款数大于余额的异常类
业务层用单例,两层之间用接口
网友评论