Java语言程序设计——篇十二

在这里插入图片描述
在这里插入图片描述

       🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿

  • 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳🌳
    您的点赞👍、关注➕、收藏⭐️、评论📝、私信📧是我最大的支持与鼓舞!!!🌻🌻🌻

异常处理

  • 主要内容
    • 1️⃣异常与异常类
      • 异常
      • 异常类
    • 2️⃣异常处理
      • 异常的抛出与捕获
      • try-catch-finally语句
      • 用catch捕获多个异常
      • 声明方法抛出异常
      • 用throw语句抛出异常
      • 使用try-with-resources语句
        • 实战演练
    • 3️⃣自定义异常
        • 实战演练
    • 4️⃣断言
      • 使用断言
      • 开启和关闭断言
      • 何时使用断言
        • 断言示例

主要内容

1️⃣异常与异常类(异常是什么?Java内部提供了哪些异常类)
2️⃣异常处理(如何处理异常?)
3️⃣自定义异常类(用户自己如何定义异常类?)
4️⃣ 断言(高级的异常处理形式)

1️⃣异常与异常类

异常

  • 异常(exception)是在程序运行过程中产生的使程序终止正常运行的错误对象。
  • 如数组下标越界、整数除法中零作除数、文件找不到等都可能使程序终止运行。

异常类

  • Java定义了多种异常类。都是java.lang.Throwable类的子类,它是Object类的直接子类。
  • Throwable类有两个子类
    ① Error类
    ② Exception类
    在这里插入图片描述
    在这里插入图片描述

2️⃣异常处理

异常的抛出与捕获

  • 方法运行过程中如果产生了异常,在这个方法中就生成一个代表该异常类的对象,并把它交给运行时系统,运行时系统寻找相应的代码来处理该异常。这个过程称为抛出异常。
  • 运行时系统在方法的调用栈中查找,从产生异常的方法开始进行回溯,直到找到包含相应异常处理的方法为止,这一过程称为捕获异常。
  • 方法调用与回溯如图所示。
    在这里插入图片描述

try-catch-finally语句

try{// 需要处理的代码
} catch (ExceptionType1 exceptionObject){// 异常处理代码
}[catch (ExceptionType2 exceptionObject){// 异常处理代码
}
finally{// 最后处理代码
} ]

用catch捕获多个异常

  • 如果在多个catch块捕获的异常**使用相同的代码处理,**则可以仅用一个catch块处理,而不必单独捕获每个异常,这就减少了代码重复。
  • 要在一个catch语句中处理多个异常,需要使用“或”运算符(|)分隔多个异常。

声明方法抛出异常

  • 有时方法中产生的异常不需要在该方法中处理,可能需要由该方法的调用方法处理,这时可以在声明方法时用throws子句声明抛出异常,将异常传递给调用该方法的方法处理。
 returnType methodName([paramlist]) throws ExceptionList{// 方法体} 

用throw语句抛出异常

  • 可以创建一个异常对象,然后用throw语句抛出,或者将捕获到的异常对象用throw语句再次抛出,throw语句的格式如下:
  throw  exceptInstance;

使用try-with-resources语句

  • 在JDK 7之前,通常使用finally语句确保调用close()方法:
 try{// 打开资源}catch(Exception e){// 处理异常}finally{// 关闭资源}
实战演练

下面是打开一个数据库连接的典型代码:

Connection connection = null;
try{// 创建连接对象并执行操作
}catch(Exception e){// 处理异常
}finally{if(connection!=null){try{connection.close();}catch(SQLException e){  // 处理异常  }}
}   
  • JDK 7提供的自动关闭资源的功能为管理资源(如文件流、数据库连接等)提供了一种更加简便的方式。这种功能是通过一种新的try语句实现的,叫try-with-resources,有时称为自动资源管理。
  • try-with-resources的主要好处是可以避免在资源(如文件流)不需要时忘记将其关闭。
  • try-with-resources语句的基本形式如下:
try(声明和创建某种资源 )//(只有实现了java.lang.AutoCloseable接口的那些资源才可自动关闭。)
{// 使用资源
}[catch(Exception  e){}][finally{ }]

3️⃣自定义异常

  • 编写自定义异常类实际上是继承一个标准异常类,通常继承Exception类,如下所示:
 class CustomException extends Exception {   public CustomException(){}  public CustomException(String message) {  super(message);    }}
实战演练

问题描述:
程序中需要验证用户输入的数据值必须是正值。如果用户提供的是负值,程序抛出异常。
编写一个自定义异常类NegativeValueException,负值异常。

// 自定义运行时异常类 NegativeValueException  
public class NegativeValueException extends RuntimeException {  // 可以添加一个无参构造器  public NegativeValueException() {  super("输入值不能为负!");  }  // 也可以添加一个带有详细错误信息的构造器  public NegativeValueException(String message) {  super(message);  }  // 还可以添加一个带有错误信息和原因的构造器  public NegativeValueException(String message, Throwable cause) {  super(message, cause);  }  // 还可以添加一个带有原因的构造器  public NegativeValueException(Throwable cause) {  super(cause);  }  // 根据需要,你也可以添加更多的构造器或方法  
}

然后,你可以在你的程序中使用这个异常类来验证用户输入的值。下面是一个简单的示例,展示了如何在用户输入负值时抛出NegativeValueException:

import java.util.Scanner;  public class Main {  public static void main(String[] args) {  Scanner scanner = new Scanner(System.in);  System.out.print("请输入一个正数: ");  double input = scanner.nextDouble();  try {  validatePositive(input);  System.out.println("输入有效,您输入的是: " + input);  } catch (NegativeValueException e) {  System.out.println(e.getMessage());  }  scanner.close();  }  // 验证输入是否为正数  public static void validatePositive(double number) throws NegativeValueException {  if (number < 0) {  throw new NegativeValueException("您输入了一个负数!");  }  }  
}

在这个示例中,validatePositive方法用于检查用户输入的值是否为正数。如果输入的是负数,它将抛出一个NegativeValueException。在main方法中,通过try-catch块捕获并处理这个异常。如果用户输入了负数,程序将输出错误消息而不是崩溃。

4️⃣断言

使用断言

  • 所谓断言(assertion)是一个Java语句,其中指定一个布尔表达式,程序员认为在程序执行时该表达式的值应该为true。
  • 程序通过计算该布尔表达式执行断言,若该表达式为false程序会报告一个错误。通过验证断言是true,能够使程序员确信程序的正确性。
  • 断言是通过assert关键字来声明的,断言的使用有两种格式:
assert expression ;//如果该表达式值为false,抛出AssertionError异常
assert expression : detailMessage ;

开启和关闭断言

  • 编译带有断言的程序与一般程序相同。默认情况下,断言在运行时是关闭的,要开启断言功能,在运行程序时需要使用 –enableassertions或-ea选项,例如:

D:\study>java –ea AssertionDemo

  • 在Eclipse中要开启断言,按下列步骤操作:
    Run→ Run Configurations → 选择Arguments选项卡
    → Arguments文本框中输入–enableassertions 或-ea 然后执行程序

    何时使用断言

  • 通常来说,断言用于检查一些关键的值,并且这些值对整个应用程序或局部功能的实现有较大影响,并且当断言失败,这些错误是不容易恢复的。
  • 以下是一些使用断言的情况,它们可以使Java程序的可靠性更高。
    1. 检查控制流
      在ifelse和switchcase结构中,可以在不应该发生的控制支流上加上assert false语句。如果这种情况发生了,断言就能够检查出来。
      例如,假设x的值只能取1、2或3,可以编写下面的代码:
 switch (x) {case 1:;case 2:;case 3:;default: assert false : “x 值非法:" + x;}
    1. 检查前置条件(precondition)
      private修饰的方法前检查输入参数是否有效。
      例如,某方法可能要求输入的参数param不能为null,就可以在方法的开头加上下面语句:
assert param != null:"参数不能为null";
    1. 检查后置条件(postcondition)
      在方法计算之后检查结果是否有效。对于一些计算方法,运行完成后,某些值需要保证一定的性质。
      例如,对计算绝对值的方法可以在方法的结束处使用下面语句进行检查:
assert value >= 0:"结果应该大于等于0:" + value; 
    1. 检查程序不变量
      在程序的运行过程中这些变量的值是不变的,称为不变量。这些不变量可能是一个简单表达式,也可能是一个复杂表达式。对于一些关键的不变量,可以通过assert进行检查。
断言示例

问题描述
使用对象数组实现一个简单的栈类,在push()、pop()和topValue()方法中使用断言。

public class SimpleStack<T> {  private Object[] elements;  private int size;  private int capacity;  public SimpleStack(int initialCapacity) {  capacity = initialCapacity;  elements = new Object[capacity];  size = 0;  }  // 向栈中添加元素  public void push(T item) {  assert size < capacity : "Stack is full, cannot push new item";  elements[size++] = item;  }  // 从栈中移除并返回顶部元素  @SuppressWarnings("unchecked")  public T pop() {  assert size > 0 : "Stack is empty, cannot pop item";  return (T) elements[--size];  }  // 返回栈顶元素但不移除  @SuppressWarnings("unchecked")  public T topValue() {  assert size > 0 : "Stack is empty, cannot access top value";  return (T) elements[size - 1];  }  // 获取栈的当前大小  public int getSize() {  return size;  }  // 获取栈的容量  public int getCapacity() {  return capacity;  }  // 为了简单起见,这里不实现扩容逻辑  // 在实际应用中,你可能需要在push时检查容量,并在需要时扩容  
}  // 使用示例  
public class Main {  public static void main(String[] args) {  SimpleStack<Integer> stack = new SimpleStack<>(5);  stack.push(1);  stack.push(2);  stack.push(3);  System.out.println("Top value: " + stack.topValue()); // 应输出 3  stack.pop();  System.out.println("New top value: " + stack.topValue()); // 应输出 2  // 尝试在空栈上调用 pop() 或 topValue(),这将触发断言错误(如果启用了断言)  // 注意:在生产环境中,断言可能会被禁用,因此最好有额外的错误处理逻辑  // stack.pop(); // 这将引发 AssertionError,如果断言被启用  }  
}

博主用心写,读者点关注,互动传真情,只是不迷路。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT能代替网络作家吗?

最强AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 当然可以&#xff01;只要你玩写作AI玩得6&#xff0c;甚至可以达到某些大神的水平&#xff01; 看看大神、小白、AI输出内容的区…

【枚举 图论】2242. 节点序列的最大得分

本文涉及知识点 枚举 图论知识汇总 LeetCode 2242. 节点序列的最大得分 给你一个 n 个节点的 无向图 &#xff0c;节点编号为 0 到 n - 1 。 给你一个下标从 0 开始的整数数组 scores &#xff0c;其中 scores[i] 是第 i 个节点的分数。同时给你一个二维整数数组 edges &…

logging日志实操入门

一、代码 import logging from logging.handlers import RotatingFileHandler # 配置日志 log_file_path ./logs/test.log file_handler RotatingFileHandler(log_file_path, maxBytes10, backupCount5)# 设置格式化器&#xff0c;以使日志更易读 formatter logging.Format…

Webstorm的下载与安装

Webstorm的下载 1 在浏览器的地址栏输入https://www.jetbrains.com/webstorm/&#xff0c;进入主页面 2 点击右上角的Download按钮&#xff0c;进入下载页面&#xff0c;如图所示 Webstorm的安装 按步骤逐步安装即可

SwiftUI 如何定制 Picker 视图当前选中行的背景颜色?

功能需求 有时我们希望可以定制 SwiftUI 中 Picker 视图当前选中行的背景色,这可以做到吗? 在上面的演示图中,我们随心所欲地变换着 SwiftUI 中 Picker 视图当前选中行的背景色。这是怎么做到的呢? 在本篇博文中,您将学到以下内容 功能需求1. 钩深极奥:修改 SwiftUI 原…

嵌入式学习之路 13(C语言基础学习——预处理命令)

编程流程 在进行程序开发时&#xff0c;通常遵循编辑源代码、编译、运行和调试这几个主要步骤。 编辑源代码&#xff1a;使用文本编辑器创建或修改程序的源代码&#xff0c;这是整个编程过程的起点。编译&#xff1a;将源代码转换为可执行文件的关键步骤。 预处理&#xff1a…

C#重要知识归纳总结

C#教程 C# 结构体&#xff08;Struct&#xff09; | 菜鸟教程C# 结构体&#xff08;Struct&#xff09; 在 C# 中&#xff0c;结构体&#xff08;struct&#xff09;是一种值类型&#xff08;value type&#xff09;&#xff0c;用于组织和存储相关数据。 在 C# 中&#xff0c…

微服务-实现nacos的集群和Gateway网关的实现、认证校验、解决跨域

1. nacos的集群模式 1.1 分析 nacos在企业中的使用100%都是集群模式。需要掌握nacos集群的搭建 nacos的数据存放在derby本地磁盘中&#xff0c;nacos集群模式会导致数据库数据不一致&#xff0c;使用加一层思想&#xff0c;修改nacos的数据库&#xff0c;使用mysql数据库&…

浅析中国蚁剑的木马加密流量

简介 在蓝帽杯 2022 初赛中&#xff0c;domainhacker 的流量分析题目聚焦于中国蚁剑这款 webshell 管理工具的流量特征。通过对比赛提供的数据包进行解析&#xff0c;本文将深入分析蚁剑在连接木马时产生的加密流量。 公司安全部门&#xff0c;在流量设备中发现了疑似黑客入侵的…

idea使用free流程,2024idea免费使用

1.先到官网下载&#xff0c;这里选择win系统的&#xff0c;点击下图的.exe https://www.jetbrains.com/idea/download/?sectionwindows 2.下载好后基本上就是一直点击“下一步”到直到安装好&#xff0c;安装好后先打开软件后关闭退出 3.下载配配套资料 链接: https://pan.ba…

MySQL内存模型与相关技术

MySQL实例的大概结构如下 如上图所示&#xff0c;InnoDB的存储引擎右多个内存块 维护所有进程/线程需要访问多个内部数据结构缓存磁盘上的数据&#xff0c;方便快速读取&#xff0c;且修改的数据缓存在此&#xff0c;满了后统一写入磁盘重做日志&#xff08;redo log&#xf…

5.3 需求分析

需求分析 软件需求定义分类练习题 需求工程需求获取练习题 需求分析状态转化图数据流图DFD顶层数据流图0层数据流图1层数据流图 练习题 需求规约需求定义方法 需求验证需求管理版本控制需求跟踪变更控制练习题 考试大概3分 软件需求 定义 软件需求&#xff1a;是指用户对目标…

【QT常用技术讲解】tableWidget右键菜单及多进程编程

前言 本文在QT项目的开发框架的基础上&#xff08;源代码&#xff09;增加tableWidget的右键菜单功能&#xff0c;并使用进程实现ping计算机的功能来讲解&#xff0c;本文不对进程间通信进行讲解。 概述 一个项目在开发过程中&#xff0c;通常面临着引入“第三方应用”&#x…

春秋云境 | 文件上传 | CVE-2022-30887

目录 靶标介绍 开启靶场 上传一句话木马 蚁剑连接 找到 flag 靶标介绍 多语言药房管理系统 (MPMS) 是用 PHP 和 MySQL 开发的, 该软件的主要目的是在药房和客户之间提供一套接口&#xff0c;客户是该软件的主要用户。该软件有助于为药房业务创建一个综合数据库&#xff0…

【代码随想录训练营第42期 Day22打卡 回溯Part1 - LeetCode 77. 组合 216.组合总和III 17.电话号码的字母组合

目录 一、做题心得 二、回溯基础知识 1.定义 2.适用问题 3.一个思想 4.代码实现 三、题目与题解 题目一&#xff1a;77. 组合 题目链接 题解&#xff1a;回溯 题目二&#xff1a;216.组合总和III 题目链接 题解&#xff1a;回溯 题目三&#xff1a;17.电话号码的字…

第十九天(2024.8.7)Vue Element-plus

1.Vue 1.创建vue文件 1.创建一个文件夹来存储vue文件 我在D盘下创建了一个EasyVue文件夹来存储vue文件 2.在控制台中输入 如果在控制台中按下面步骤成功不了的话&#xff0c;尝试&#xff1a;1.用管理员身份运行控制台 2.关闭防火墙 3.打开编码工具&#xff08;Visual St…

WPF学习(5)- Border控件(边框布局)+GridSplitter分割窗口

严格来说&#xff0c;Border并不是一个布局控件&#xff0c;因为它并不是Panel的子类&#xff0c;而是Decorator装饰器的子类&#xff0c;而Decorator继承于FrameworkElement。我们要先看看它的父类Decorator。 public class Decorator : FrameworkElement, IAddChild {public…

CUDA编程05 - GPU内存架构和数据局部性

一&#xff1a;概述 到目前为止&#xff0c;我们已经学会了如何编写 CUDA 核函数&#xff0c;以及如何设置和分配大量线程来执行核函数。我们还了解了当前 GPU 硬件的计算架构&#xff0c;以及线程在硬件上调度执行过程。在本章中&#xff0c;我们将重点关注 GPU 的片上(on-chi…

Redisson 实现分布式锁

文章目录 Redisson 是什么Redisson 使用客户端模式单节点模式哨兵模式主从模式集群模式Spring Boot 整合 Redisson 中的锁Redisson 可重入锁Redisson 公平锁Redisson 联锁Redisson 读写锁Redisson Redlock Redisson 的看门狗机制RedLock 解决单体故障问题如何使用 RedLockMarti…

【C语言篇】操作符详解(上篇)

文章目录 操作符详解&#xff08;上篇&#xff09;前言sizeof强制类型转换算术操作符赋值操作符逻辑操作符逻辑取反运算符逻辑与运算符逻辑或运算符 关系操作符自增自减操作符和-逗号表达式 操作符详解&#xff08;上篇&#xff09; 前言 操作符又被叫做运算符&#xff0c;是不…