• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

黄文超

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

java中的异常处理以及finally的问题

java中的异常处理

1、java中的主要异常类型

1、受检查异常:jvm可以检查到的异常对象,在编译的时候就会报错,让你抛出异常,或者用try...catch处理。
2、非受检异常:jvm不能检查到的异常对象(例如运行时异常),只能程序员自己检查,自己处理。

2、try...catch...finally

(1)、finally啥时候运行

1、只要程序还在内存中,finally就会被执行
2、代码中,在finally之前使用System.exit(0)使得程序退出,将不会执行finally。
3、遇到断电,电脑崩溃导致的程序不能运行,finally也不会执行。

(2)、finally需要注意的问题

程序如果提前return,那么finally会被执行吗?
public class Test {
    public static void main(String[] args) {
       try {
           System.out.println("程序执行了");
           return;
       } catch (Exception e) {
       } finally {
           System.out.println("finally执行了");
       }
    }
}
结果:
	程序执行了
	finally执行了
结论:
	在程序中即使在finally之前返回了,finally也会被执行
return和finally之间执行关系究竟是怎么回事?

首先来看第一段代码:

public class Test {
    public static void main(String[] args) {
        System.out.println(test().age);
    }

    public static Person test() {
        Person p= new Person();
        try {
            p.age = 10;
            return p;
        } finally {
            p.age = 20;
        }
    }
}

class Person {
    int age;
}
结果:
	20

分析一下原因:

1、首先在栈内存中创建一个Person p的这么一个变量,然后堆内存中创建Person对象,把地址给p
2、p.age首先被赋值10,然后返回p,这个时候因为程序看到了有finally,所以return先把要返回的数据准备着,等finally执行完成后再执行
3、此时return拿到的值为一个地址值,即堆内存中的Person对象
4、当执行finally时候,我们修改的是堆内存中地址为0X123的对象的值
5、finally执行完成,最终返回,于是我们得到的p.age是20

然后我们来看第二段代码:

public class Test02 {
    public static void main(String[] args) {
        System.out.println(getNum());
    }
    public static int getNum() {
        int a = 5;
        try {
            return a;
        } catch (Exception e) {
            return 0;
        } finally {
            a = 10;
        }
    }
}
结果:
	5

分析一下原因:

1、首先我们在栈内存中定义一个int a = 5
2、然后我们在try中看到返回这个命令,于是把5准备着给return,等finally执行完毕
3、finally把a的值修改为10,但是因为此时return准备的值是5,所以最终返回的值是5
4、程序结束,返回值为5

3、throws关键字

throws使用时机

1、调用者传递过来的参数不对,需要调用者自行去解决
2、程序确实没办法处理了

posted on 2021-03-14 10:47  黄文超  阅读(416)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3