【异常----finally和自定义异常】

文章目录

  • finally
    • 练习
    • 问题
  • 异常的处理流程
  • 【异常处理流程总结】
  • 自定义异常类


finally

有些特定的代码,不论程序是否发生异常,都需要执行,比如程序中打开的资源:在程序正常或者异常退出时,必须要对资源进进行回收。另外,因为异常会引发程序的跳转,可能导致有些语句执行不到,finally就是用来解决这个问题的。

语法格式:

try{
// 可能会发生异常的代码
}catch(异常类型 e){
// 对捕获到的异常进行处理
}finally{
// 此处的语句无论是否发生异常,都会被执行到
}
// 如果没有抛出异常,或者异常被捕获处理了,这里的代码也会执行
public static void main(String[] args) {
try{
int[] arr = {1,2,3};
arr[100] = 10;
arr[0] = 10;
}catch (ArrayIndexOutOfBoundsException e){
System.out.println(e);
}finally {
System.out.println("finally中的代码一定会执行");
}
System.out.println("如果没有抛出异常,或者异常被处理了,try-catch后的代码也会执行");
}

那为什么还要finally?

因为有一种情况是:进入try语句之后,报了异常,又进入catch语句,然后又进入finally语句,最后在try语句遇到return返回。导致try-catch-finally之后的代码根本就没有执行,会造成资源泄漏。
所以:finally中的代码一定会执行的,一般在finally中进行一些资源清理的扫尾工作。

public class Test {
   public static int getData(){
      Scanner sc = null;
      try{
         sc = new Scanner(System.in);
         int data = sc.nextInt();
         return data;
      }catch (InputMismatchException e){
         e.printStackTrace();
      }finally {
         System.out.println("finally中代码");
      }
      System.out.println("try-catch-finally之后代码");
      if(null != sc){
         sc.close();
      }
      return 0;
   }

   public static void main(String[] args) {
      int data = getData();
      System.out.println(data);
   }
}

练习

// 下面程序输出什么?
public static void main(String[] args) {
System.out.println(func());
}
public static int func() {
try {
return 10;
} finally {
return 20;
}
}
A: 10 B: 20 C: 30 D: 编译失败
//答案是B

finally 的执行,先执行finally才执行方法(try 或者 catch 中如果有 return ). 但是如果finally 中也存在 return 语句, 那么就会执行 finally 中的 return, 从而不会执行到 try 中原有的 return。
所以不建议在 finally 中写 return

问题

  1. throw 和 throws 的区别?
    答: throw 用来扔出异常, throws用来在方法定义时声明异常
  2. finally中的语句一定会执行吗?
    答:一定会

异常的处理流程

如果本方法中没有合适的处理异常的方式, 就会沿着调用栈向上传递。
如果向上一直传递都没有合适的方法处理异常, 最终就会交给 JVM 处理, 程序就会异常终止。

public static void main(String[] args) {
func();
System.out.println("after try catch");
}
public static void func() {
int[] arr = {1, 2, 3};
System.out.println(arr[100]);
}

在这里插入图片描述
程序已经异常终止了, 没有执行到 System.out.println(“after try catch”); 这一行。

【异常处理流程总结】

  1. 程序先执行 try 中的代码
  2. 如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch中的异常类型是否匹配.
  3. 如果找到匹配的异常类型, 就会执行 catch 中的代码
  4. 如果没有找到匹配的异常类型,就会将异常向上传递到上层调用者.
  5. 无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行).
  6. 如果上层调用者也没有处理的了异常, 就继续向上传递.
  7. 一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理,
    此时程序就会异常终止.

自定义异常类

有些异常类无法满足要求,所以可以自己实现自定义异常类

//实现一个用户登陆功能.

具体方式:
1.自定义异常类,然后继承自Exception 或者 RunTimeException
2.实现一个带有String类型参数的构造方法,参数含义:出现异常的原因

public class LogIn {
   private String userName = "admin";
   private String password = "123456";
   
public static void loginInfo(String userName, String password)throws UserNameException,PasswordException{
     if (!userName.equals(userName)) {
       throw new UserNameException("用户名错误!");
  }
     if (!password.equals(password)) {
       throw new PasswordException("用户名错误!");
  }
       System.out.println("登陆成功");
  }
public static void main(String[] args) {
     try {
     loginInfo("admin", "123456");
     } catch (UserNameException e) {
     e.printStackTrace();
     } catch (PasswordException e) {
     e.printStackTrace();
     }
}
}

class UserNameException extends Exception {
    public UserNameException(String message) {
      super(message);
    }
}
class PasswordException extends Exception {
    public PasswordException(String message) {
      super(message);
    }
}

注意事项
自定义异常通常会继承自 Exception 或者 RuntimeException
继承自 Exception的异常默认是受查异常
继承自 RuntimeException 的异常默认是非受查异常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/129191.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023.11.10联测总结

T 1 T1 T1求的是有多少个区间的异或和是 k k k的因子, n , k ≤ 1 0 5 n,k \leq 10^5 n,k≤105。 这道题用前缀和维护一下,暴力枚举所有区间就有 80 80 80分。 有一瞬间想过枚举因数,但是脑抽以为要 O ( n ) \mathcal O(n) O(n)枚举&#x…

计算机技术专业CSIT883系统分析与项目管理介绍

文章目录 前言一、学科学习成果二、使用步骤最低出勤要求 前言 本课程介绍了信息系统开发中的技术和技术,以及与管理信息技术项目的任务相关的方法和过程。 它研究了系统分析师、客户和用户在系统开发生命周期中的互补角色。 它涵盖了引出系统需求的不同事实调查技…

Java进阶API第二章

Java进阶API第二章 一. 抛出企业问题,脱离main测试,模块化编程 1.学校里如何测试的 //学校教的测试方法 public static void main(String[] args) {//2.本地测试//3.调用函数//4.看输出,查看结果是否符合预期//5.预期结果和测试结果是通过人工…

CSS 文字溢出省略号显示

1. 单行文本溢出显示省略号 需要满足三个条件,添加对应的代码: (1)先强制一行内显示文本; (2)超出的部分隐藏; (3)文字用省略号来替代省略的部分&#xf…

创建两个简单表A,B 。AB表有相关联的列。并在关联列上创建索引

目录 一、创建两个简单表,并进行外键关联 1、创建表A 2、创建表B,并且关联表A 二、在关联列上创建索引 三、检查是否成功 一、创建两个简单表,并进行外键关联 1、创建表A CREATE TABLE A (id NUMBER PRIMARY KEY,name VARCHAR2(50),d…

3.5、Linux:命令行git的使用

个人主页:Lei宝啊 愿所有美好如期而遇 在Linux Centos7.6下安装git yum -y install git 注册一个gitee账号 进去注册就好,记住自己的用户名和密码。 创建一个仓库 点击复制,接着就可以在Linux上使用了 git clone git clone 刚才复制的地…

物联网AI MicroPython学习之语法 ustruct 打包和解压原始数据类型

学物联网,来万物简单IoT物联网!! ustruct 介绍 ustruct提供打包和解压原始数据类型的功能。 默认情况下,C类型以机器的本机格式和字节顺序表示,并在必要时通过跳过填充字节来正确对齐(根据C编译器使用的规…

generic webhook trigger 插件

generic webhook trigger 插件 通用 webhook 通过curl 请求触发流水线 rootubuntu20:~/luohuiwen/spring-boot-helloWorld# openssl rand -base64 32 QNJvWjUiNvNhQ4bKleI/5h2iZTKjSMREAvSJRvcM0 curl -X POST -H "Content-Type: application/json" -d { "ref…

C++:关联式容器map的使用

1、map的简介 map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。 在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同,并…

操作系统·处理机调度死锁

3.1 处理机调度概述 3.1.1 处理机调度概述 高级调度 (High level Scheduling)决定把外存上哪些作业调入内存、创建进程、分配资源。高级调度又称作业调度、长程调度或宏观调度。只在批处理系统中有高级调度。 中级调度 (Middle level Scheduling)完成进程的部分或全部在内、…

K8S容器持续Terminating无法正常关闭(sider-car容器异常,微服务容器正常)

问题 K8S上出现大量持续terminating的Pod,无法通过常规命令删除。需要编写脚本批量强制删除持续temminating的Pod:contribution-xxxxxxx。 解决 获取terminating状态的pod名称的命令: # 获取media命名空间下,名称带contributi…

短信登录实现(黑马点评为例)

文章目录 前言一、隐藏用户敏感信息二、短信验证登录、注册1.流程2.代码3.使用redis优化解决代码 二、登录拦截(校验)1.流程2.代码 总结 前言 短信登录核心知识 首先黑马点评这个短信登录是一伪验证,即后台调用工具类随机生成六位数字。 1.R…

网络虚拟化介绍(OVS、DVS)

目录 虚拟化中网络架构 虚拟交换机类型 虚拟交换机OVS(Open Vswitch) 分布式虚拟交换机DVS 虚拟机和物理网卡的通信模式 虚拟交换机中其它功能特性 网络虚拟化概念 网络虚拟化就是把网络层的一些功能从硬件中剥离出来,建立新的网络虚拟…

xlua游戏热更新(C#访问lua)

xlua作为Unity资源热更新的重要解决方案api,在Tecent重多游戏中被采用,本文通过案例去讲解xlua代码结构层次。 /** Tencent is pleased to support the open source community by making xLua available.* Copyright (C) 2016 THL A29 Limited, a Tence…

android自定义switch颜色

效果图&#xff1a; 原生样式和自己app的主题颜色不搭配&#xff0c;就可以这样自定义颜色样式。以下代码均可直接复制粘贴使用&#xff0c;且均有注释。 实现&#xff1a; 1、 新建drawable/switch_custom_thumb_on.xml&#xff08;滑块开启状态 &#xff09; <?xml ve…

WGCLOUD实践 - wgToken怎么使用

wgcloud中的wgToken&#xff0c;是server和agent通信的密钥&#xff0c;相当于密码 server配置文件中的wgToken值和agent配置文件中的wgToken值&#xff0c;需要相同&#xff0c;否则agent将无法给server上报数据 server配置文件如下&#xff1a; #server和agent的通信密钥&a…

Android修行手册-POI操作Excel实现超链接并且变为蓝色

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

阿里云双11优惠云服务器99元一年,4年396元

阿里云99元服务器新老用户均可以买&#xff0c;你没看错&#xff0c;老用户可以买&#xff0c;活动页面 aliyunfuwuqi.com/go/aliyun 配置为云服务器ECS经济型e实例、2核2G、3M固定带宽、40G ESSD Entry云盘&#xff0c;并且续费不涨价&#xff0c;原价99元即可续费&#xff0c…

论文阅读[121]使用CAE+XGBoost从荧光光谱中检测和识别饮用水中的有机污染物

【论文基本信息】 标题&#xff1a;Detection and Identification of Organic Pollutants in Drinking Water from Fluorescence Spectra Based on Deep Learning Using Convolutional Autoencoder 标题译名&#xff1a;基于使用卷积自动编码器的深度学习&#xff0c;从荧光光谱…

【考研数据结构代码题3】用栈实现十进制数转为八进制数

题目&#xff1a;将十进制数m1348转换成八进制数 难度&#xff1a;★ 算法思路&#xff1a;十进制转八进制的核心原理是“用辗转相除法不断对8取余&#xff0c;最后将余数反向输出”&#xff0c;即先求出来的余数后输出&#xff0c;符合“先进后出”的栈的特性&#xff0c;故设…