Java异常处理

Java异常处理

程序出现问题后,异常机制提供了程序退出的安全通道,程序控制权转移到了异常处理器。

程序错误分类

① 编译出错:编译程序能够自己发现,并且提供错误的原因和位置;
② 运行时错误:程序运行后,运行环境发现了不能执行的操作。
③ 逻辑错误:程序没有按照预期的逻辑执行(eg:1 / 0,异常)
在这里插入图片描述

(1)Exception:

1)运行时异常(RuntimeException,是程序员的问题);
2)非运行时异常(编译异常:IO异常、SQL异常)

(2)受查异常与非受查异常:

受查异常可用try…catch语句去捕获处理,或者用throw语句抛出。
在这里插入图片描述
【案例】

package com.test.demo;

import java.io.FileInputStream;
public class Demo1 {
    public static void main(String[] args){
        readFile();
    }
    public static void readFile(){
        FileInputStream inputStream = new FileInputStream("xxx.txt");
    }
}

在这里插入图片描述
在这里插入图片描述
(1)捕捉异常:try … catch

    public static void readFile(){
        try {
            FileInputStream inputStream = new FileInputStream("xxx.txt");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

在这里插入图片描述
——程序正常进行,但是会捕获异常
(2)声明异常 / 抛出异常

    public static void readFile() throws FileNotFoundException {
        FileInputStream inputStream = new FileInputStream("xxx.txt");
    }

在这里插入图片描述
它把异常抛到了main方法:
在这里插入图片描述
此时需要对main方法进行操作,提供了两种方法:
在这里插入图片描述

    public static void main(String[] args) throws FileNotFoundException {
        readFile();
    }

这两种方法的运行结果一致,如下图:
在这里插入图片描述

异常处理:

(1)捕获异常:try … catch…

格式:

try{
    //可能异常的代码
} catch (Exception e) {
    System.out.println("要输出的异常处理说明语句");
    e.printStackTrace();
}finally {
    //可有可无
}

【try、catch、finally用法总结】

这块内容所转载的原文
1、不管有没有异常,finally中的代码都会执行;
  
2、当try、catch中有return时,finally中的代码依然会继续执行;
  
3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。

4、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值
【案例】
1、

public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(test());
    }
   public static int test(){
       int i = 1;
       try{
           i++;
           System.out.println("try block, i = "+i);
       }catch(Exception e){
           i ++;
           System.out.println("catch block i = "+i);
       }finally{
           i = 10;
           System.out.println("finally block i = "+i);
       }
       return i;
   }

结果输出如下:

try block, i = 2

finally block i = 10

10

先执行try块,并没有捕获到异常,finally 块,最后return。
  
2、当我们把return放到try块中和catch块中,会怎么样呢?你们会不会纠结先return呢还是先finally呢?返回值i会改变吗?

public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(test());
    }
   public static int test(){
       int i = 1;
       try{
           i++;
           System.out.println("try block, i = "+i);
           return i;
       }catch(Exception e){
           i ++;
           System.out.println("catch block i = "+i);
           return i;
       }finally{
           i = 10;
           System.out.println("finally block i = "+i);
       }
   }

结果输出如下:

try block, i = 2
  finally block i = 10
  2
结论:
2、当try、catch中有return时,finally中的代码依然会继续执行

3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。

(2)声明异常: throw

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值