try-catch结构的理解与使用(finally是可选的)
finally在何时使用以及如何使用详情请见 https://blog.youkuaiyun.com/m0_53777734/article/details/115316849
package com.yichang.bean;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/*
* 一、什么是异常处理
* 将异常处理的程序代码集中在一起,于正常的程序代码分开,使得程序简洁、优雅、并易于维护
*
*
* 二、为什么要使用异常处理
* 在编写程序时,经常要在可能出现错误的地方加上检测的代码,比如进行x/y 运算时,要
* 检测分母是否为0,数据为空,输入的不是数据而是字符等。过多的if-else分支会导致程
* 序的代码加长、臃肿、可读性差。因此采用异常处理机制
*
*
*三、如何使用异常处理
*
* 1、异常的处理,抓抛模型
* 过程一:“抛”:程序正在执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象
* 并将此对象抛出。
* 一旦抛出对象以后,其后代码就不再执行。
* 过程二:“抓”:可以理解为异常的处理方式:①try-catch-finally
* ②throws
* 2、try-catch-finally的使用
*
* try{
* //可能出现的异常
* }catch(异常类型1 变量名1){
* //处理异常的方式1
* }catch(异常类型2 变量名2){
* //处理异常的方式2
* }catch(异常类型3 变量名3){
* //处理异常的方式3
* }
* ...
* finally{
* //一定会执行的代码
* }
*
* 注意:
* ①finally时可选的(相当于switch-case结构中的default是可选的)
* ②使用try将可能出现异常的代码包装起来,在执行的过程中,一旦出现异常,就会生成一个对应异常类的
* 对象,根据此对象的类型,去catch中进行匹配
* ③一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常的处理,一旦处理完成,就跳出
* 当前的try-catch结构(在未写finally的情况下,如果写finally,则一定会执行finally里的代码)
* 继续执行其后的代码
* ④catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下,都可
* 如果有子父类关系,则要求子类一定声明在父类的下面
* ⑤常用的异常处理的方式:
* ①String gerMessage();
* ②printStackTrace();
* ⑥在try结构中声明的变量,在出了try结构以后,就不能再被调用
* 3、try-catch-finally中finally的使用
* 祥见
* 4/try-catch-finally是可以嵌套的
*
*说明:①使用try-catch-finally结构处理编译时异常时,使程序在编译时不报错,但是在运行时仍会报错
* 相当于把一个编译时可能出现的异常,延迟到运行时出现
* ②由于运行时异常比较常见,所以我们通常不针对运行时异常写try-catch-finally结构,但是针对
* 编译时的异常,我们一定要考虑异常处理,因为如果不处理,编译都无法通过,更不要说运行了
* */
public class Exception extends Throwable {
public static void main(String[] args) {
Exception e = new Exception();
e.test2();
}
public void test(){
String str = "abc";
int num = 0;
try{
num = Integer.parseInt(str);
//由注意点②③的知识可知,此时出现的错误被下面捕获,
//后便跳出了此结构,所以 “hello-------1” 不能被执行
System.out.println("hello---------1");
}catch(NumberFormatException e){
System.out.println("此处出现数值转换异常");
System.out.println(e.getMessage());//常用的处理方式①
e.printStackTrace();//常用的处理方式②
}catch(NullPointerException e){
System.out.println("出现空指针异常");
}
System.out.println("hello---------2");
System.out.println(num);//如果想用num,就要再大括号外面声明,且要初始化
}
//体会:使用try-catch-finally处理编译时异常,使得程序再编译时就不再报错,但是运行时仍可能报错
// 相当于我们使用try-catch-finally将一个编译时可能出现的异常,延迟到运行时才出现
public void test2() {
try {
File file = new File("hello.text");
FileInputStream fis = new FileInputStream(file);
int data = fis.read();
while (data != -1) {
System.out.println((char) (data));
data = fis.read();
}
fis.close();
} catch (IOException e){
e.printStackTrace();
} finally{
System.out.println("一定会被执行的代码");
}
}
}