异常处理方式一
try-----catch-----finally的结构
eg:
try{
//这里是异常发生的语句
}catch(异常类型1 变量名){
//处理异常的方式1
//这里是要对异常进行处理的语句
//这里我们一般使用两个常用的方法对异常进行处理
}catch(异常类型2 变量名){
//异常的处理方式2
}catch(异常类型3 变量名){
//异常的处理方式3
}
...
finally{
//一定会执行的代码
}
- try就是起了一个监听目的
- try中就是要包住可能会出现异常的代码(其中可以以包一些没有异常的正常的代码,但尽量少包)
注意:一旦try中可能发生异常的语句真的发生异常之后,就会抛出异常对象,那么try中异常语句后的代码就会不再执行了
- 上面的try-----catch-----finally结构中的finally可以加也可以不加,就和switch语句中的defauly有点像
try------catch-------finally使用中的注意事项
-
finally是可选的(可以写,也可以不写)
-
使用try将可能出现异常的代码包装起来,一旦出现异常,就会生成一个对应的异常类型的对象,根据此异常的类型去catch中匹配
-
一旦try中的异常对象匹配到某一个catch中时,就进入catch中进行异常的处理,一旦处理完成就跳出当前的try----catch结构(没有写finally的情况),继续执行其后的代码
-
catch中的异常类型如果没有子父类关系,谁声明在上谁声明在下都没有关系(但是如果catch中的异常存在字父类关系,则要求子类一定要定义在父类的上面,否则就会编译报错)
-
catch中常用的异常对象处理方式:
方式一: String(这里的String为返回值) getmessage()
方式二: printStackTrace() (这个函数没有返回值)
- 这两个异常处理方式,方式二更加常用
-
在try结构中声明的变量在出了try结构以后,就不能再被调用了
- 这时我们可以将声明变量进行在try结的外面,只在try结中进行赋值就行了
-
try ------catch----finally结构可以嵌套使用
体会一下通过使用try----catch—finally处理编译时异常,使得程序在编译时就不再报错,但是运行时仍旧可能报错(相当于我们使用try----catch----finally将一个编译时可能出现的异常延迟到运行时出现)
try-----catch------finally解决编译时异常:
eg:
public static void main(args [] args){
File file=new File("hello.txt);
FileInputStream fis=new FileInPutStream(file); // FileNotFoundException(可能回发生)
int data = fis.read(); //可能会发生IOException
While(data!=1){
System.out.Println((char)data);
data=fis.read(); //IOException
}
fis.close(); //IOException
//这里的FileNotFoundException是IOException的一个子类
}
try ------catch-----finally中finally的使用
- finally是可选的,可以写也可以不写
- finally中的写的代码是一定会被执行的语句,即使是catch中又出现异常了(这个时候catch后的代码就不会执行了),try中又return语句,catch中有return语句等情况下,都也会执行finally中的语句
- 什么时候用finally"
- 像数据库链接,输入输出流,网络编程中的socket等资源等jvm是不能自动垃圾回收的,我们就需要自己手动的进行资源的释放,此时的资源释放就需要声明在finally中
编译时异常和运行时异常的不同处理:
开发中由于运行时异常比较常见,而且运行时异常在我们编写代码时不可见,所以我们通常不针对运行时异常
编写try-----catch------finally
而针对编译时的异常,我么就一定要考虑异常的处理