什么是异常
比如你使用java程序开发了一个计算器,可以让用户进行计算,但是在计算除法的过程中(程序运行过程中),用户把除数设为0, 这时我们的程序执行就会出错(大家都读过小学,知道除法中,除数不能为0),即抛出异常。异常情况是指程序在运行时,可能由与外部系统的条件变更(与我们一厢情愿所设想的不一设)而导致程序可能会出错的情况,如我们的代码要连结数据库,但数据库未启动,要创建目录,操作系统上却己存在同名的真实文件;即所谓异常是指可能(仅是可能)由与外部系统的,导致程序可能出错(中断运行)的原因。
try-catch:
try{
可能抛出异常的代码. . .
//如果没有问题出理,执行如下面的代码
(A)其它计算代码…
}catch(Exception ef){
//如果出现异常后执行的代码:
(B)出了异常情况的计算代码. . .
}
如
当任意两边不大于另一边时抛出异常,用catch接收异常
当不管是否异常时都执行方法,则使用finally
需要注意的是:
try catch块中变量做用域:try块中定义的变量符合我们前面所讲的变量做用范围的规则,即变量只能在限定自己最近的一对大括号内使用;即try catch块内一对大括号中定义的变量不能在后面的代码块内使用;
方法返回值:如果方法有定义的返回值,这个方法就有可以在正常执行时有一个返回值,或在catch到异常时有个返回值---不能仅仅只在try块中return一个返回值。
要注意的是,并不是所有的异常都强制需要try catch,在java中,异常分为强制检测和非强制检测二种
如果某段代码可以会出现多个异常,那么我们可以使用一个try后面接多个catch来进行处理,如果多个异常有继承关系,那么我们应该先写子类,再写父类
1:即在try...catch块中定义的变量为局部变量
2:try...catch需要同时用void或返回值接收(相当于for循环或switch里每个判断条件处理结果返回值类型相同)
3:try...catch不是必须的,但是有try必有catch
4:即具体异常写在前面,总异常Exception e或子异常的父类写在最后
throw 与throws
throw new 异常类型([异常信息]);
throws 异常类型1,异常类型2…
自定义异常
创建自定义异常,需要继承Exception 或其子类。习惯上包装一下父类的构造方法。
在编码规范上,一般将自定义异常类的类名命名为 XXXException,其中 XXX 用来代表该异常的作用,如 <class><自定义异常名><extends><Exception>
自定义异常类一般包含两个构造方法:一个是无参的默认构造方法,另一个构造方法以字符串的形式接收一个定制的异常消息,并将该消息传递给超类的构造方法。
疑问1:
为什么在抛出异常后执行输出语句会直接报错?
疑问2:
既然在throw new Exception()时会输出异常信息,那catch时执行输出语句岂不是多此一举?