三、异常
1、概述
程序有可能出现问题,我们把出现的问题就称为异常.
2、主函数处理异常的方式
A:主函数手动处理方式的方式.(异常处理机制)
B:采用的是jvm的默认处理机制.
把异常的信息打印输出到控制台.
3、异常的体系结构
A:Throwable 异常的超类
**Error
我们不可解决的问题。面对此种问题,我们无能为力。
比如说:类不存在或者内存溢出。
**Exception
在运行时运行出现的一些不正常的状况,这个状况我们通过修改代码,是可以解决的。
举例:骑自行车回家。
走不好的路,车爆胎,是异常。
发洪水,路给冲断了,是错误。
2003年,非典。这个东西来了,是错误。
头疼,感冒了。是异常。
B:通过分析,发现我们要学习异常。
4、异常的处理方式
A:try...catch...finally
**基本格式
try{
//有可能出现异常的代码
}catch(异常类 名字){
//处理异常的代码
}finally{
//一定会被执行的代码,如释放资源
}
**变形格式
try...catch
try...catch...catch...catch...
try...finally
try...catch...finally
try...catch...catch...finally
**finally的特点
它永远都会被执行.
有一个特殊情况:如果在代码中jvm退出系统而来,那么finally就不会被执行.
**面试题
***final,finally,finalize区别?
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码……
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用
***
try{
System.out.println("aaa");
System.out.println(10/0);//ArithmeticException
}catch(Exception e){
System.out.println("bbb");
return;
}finally{
System.out.println("ccc");
}
请问这个程序运行结果?
aaa
bbb
ccc
B:throws,throw 抛出
区别:------一旦执行throw语句,就结束功能!
**使用位置
throws在方法的声明上使用
throw在方法体内使用
**使用格式
throws后面跟的使用异常的类名
throw后面跟的是对象.格式:throw new 异常类名(参数);
**联系
有throws不一定有throw
有throw一定有throws
C:两种处理方式用哪种呢?<何时使用try,何时使用throw呢?>
**自己能够处理的就自己处理.
**自己实在处理不了的交个调用者.
5、Exception的分类
A:Exception
这种类型的异常,如果抛出,在编译的时候就会检查.此类异常需要编写针对性的处 理代码进行处理。
B:RuntimeException
这种类型的异常,如果抛出,在编译的时候不检查,运行的时候直接处理.
这种异常必须通过修改代码才能解决.所以,一般针对这种异常,我们不处理,jvm处 理。
6、自定义异常
除数不能为负数.
1:继承自Exception或者RuntimeException.必须的!
2:在自定义异常里面,提供一个带参构造
class MyException extends Exception{
MyException(){}
MyExcepiton(String message){
super(message);
}
}
class Demo{
int div(int a,int b)throws RuntimeException{
if(b<0){
throw new MyException("除数不能为负数!");
}
}
}
7、异常使用细节
A:我们为什么要使用try…catch语句进行异常处理呢?只有在某个功能上可能出现某种隐患,并且在该功能的声明上进行了描述时,我们才能够使用此种针对性的处理方式。
B:如果一个功能抛出多个异常,那么在调用该功能时,需要有多个catch进行每一个异常的针对性处理,如果多个catch中有父类异常,一定要定义在最下面,否则编译失败。
C:函数内抛出异常,函数上一定要使用thows进行标识,调用者如果调用了该函数,就需要对其进行处理(try或者抛出),否则编译失败。 |