异常处理|finally和自定义异常

Java:简述throw-throws异常抛出
Java中的异常(Exception),史上最全的教程来啦~
关于异常中的finally的使用
finally的作用

关于fianlly两个例子

finally没有return 语句

public class Exception01 {
    public static void main(String[] args) {
        System.out.println(getNum());
    }
    public static int getNum() {

       //当finally  中没有return语句时
       int i=100;
        try{
            System.out.println("try block");
            i=1/0;
            return i;
        }catch (Exception e){
            System.out.println("catch block");
            e.printStackTrace();
            i=i+5;
            return i;//最终返回的值还是  105  即 finally 对i的修改没有影响 i变量
            //理解是  在return执行时  先将此时的i入栈  然后利用一个局部变量j保存i值,在使j进入finally语句块中
        }finally {
            System.out.println("finally block");
            i=600;
        }
}

返回值

try block
catch block
finally block
105
java.lang.ArithmeticException: / by zero
	at Exception01.getNum(Exception01.java:44)
	at Exception01.main(Exception01.java:3)

为什么是105呢 ? 为什么不是600呢?
常理来说 return 语句执行 程序结束
而finally语句在结束前执行

这里我的理解是 sum为了为序
在return 返回一个值 i 的时候 会先将其入栈,然后用一个局部变量 j 赋予 i 的值,再进入finally部分

**finally语句带有return **

public class Exception01 {
    public static void main(String[] args) {
        System.out.println(getNum());
    }
  
    public static int getNum() {
       //当finally 中有return语句的时候,先在try或者catch语句中中的return值  压入栈 ,并用中间节点保存该值  进入finally,单finally中也有return 语句
        //所以此时return语句的返回值也入栈  即程序结束后 return的最终返回值 按照栈的原则  返回是finally的返回值
       int i=100;
        try {
            System.out.println("try block");
            int a = 1 / 0;
            return i++;
        } catch (Exception e) {
            System.out.println("catch block"+"且在block中的return 会自加1000");
            return i=i+1000;
        } finally {
            System.out.println("finally block");
            i=66;
            System.out.println("进入finally后的i值修改为 "+i+"且在finally中的return 会自加123");
            return i+123;
        }
    }

}

结果

try block
catch block且在block中的return 会自加1000
finally block
进入finally后的i值修改为 66且在finally中的return 会自加123
189

这里返回值为什么是189,而不是1100呢?
原因就在于 在try或catch语句的return 中确实压入栈且保存了 i 的值赋予 j 进入finally中 代表 i 值,但是由于finally中有return 语句,它的返回值也会进入同一个栈,而按照栈的先进后出原则 我们弹出栈顶元素 这样一来就是finally的return 值了

当然以上原则目前来看用来帮助理解的,也不知具体咋样,要等后面在验证!

那如何不执行finally呢
其实,在下述4种特殊情况时,finally块都不会被执行:
1)在finally语句块中发生了异常。
2)在前面的代码中用了System.exit()退出程序。
3)程序所在的线程死亡。
4)关闭CPU。

Java 如何抛出异常、自定义异常

import java.util.Scanner;

public class Userdengji {
    public static void main(String[] args) {
        UserService user=new UserService();
        System.out.println("请输入用户名和密码:");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        String password=scanner.nextLine();
        try {
            user.register(name,password);
        } catch (Usernameexception usernameexception) {
            usernameexception.printStackTrace();
        }
    }
}

class UserService {
    public UserService() {

    }
    //String name,password;
    public void register (String username, String  userpassword) throws Usernameexception{


        if(username.length()>14){
            //异常
            System.out.println(username.length());
            throw new Usernameexception("用户名个数超过14");
        }

        if(username.length()<6){
            //异常
            System.out.println(username.length());
            throw new Usernameexception("用户名低于6");
        }
    }
}

class Usernameexception extends Exception{
    public Usernameexception() {
        super();
    }

    public Usernameexception(String message) {
        super(message);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值