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

news2024/9/25 19:23:42

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

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

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

异常处理

  • 主要内容
    • 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.coloradmin.cn/o/1989039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

winform chart标记

下图为某个点的值大于25即标记为白色。 代码&#xff1a; // 设置曲线的样式Series series chart1.Series[1];// 画样条曲线&#xff08;Spline&#xff09; 散点图Pointseries.ChartType SeriesChartType.Spline;// 线宽2个像素series.BorderWidth 2;// 线的颜色&…

K8S Helm

简述 Helm 是 Kubernetes 的开源包管理器。它提供了提供、共享和使用为 Kubernetes 构建的软件的能力。它允许开发者定义、‌打包、‌发布和管理Kubernetes应用资源&#xff0c;‌类似于Linux下的apt或yum包管理器。‌Helm3的架构主要包括Helm客户端、‌Chart仓库以及Kubernet…

程序员窃喜!卡了大模型脖子的Json输出,OpenAI终于做到了100%正确

OpenAI上次提到JSON模式的概念&#xff0c;还是在去年的DevDay上。那是ChatGPT第一次拥抱JSON模式。 但这个功能可以说是饱受诟病。 经常遇到模型不遵循指令&#xff0c;不按照你想要的格式输出&#xff0c;即使在 prompt 中明确说了要按照指定格式&#xff08;比如Json、XML&…

【Java】字符/字符串转整数 常用的三个方法

前言&#xff1a; 做Oj题时&#xff0c;偶尔需要用到&#xff0c;久了不用&#xff0c;用到就得查一下&#xff0c;遂总结一篇用法&#xff0c;加深记忆。 目录 方法1&#xff1a;使用字符的ASCII值&#xff08;字符&#xff09; 方法2&#xff1a;使用Character.getNumeri…

【GCC】结合GPT4 延迟梯度学习1:公式推导及理论分析

大神的分析 本文主要借鉴。【TWCC 】基于gpt和python简化分析webrtc拥塞控制论文: Analysis and Design of the Google Congestion Contro for Web Real-time Communication (WebRTC)感觉应该学习好理论后再进行python 分析:【gcc】基于gpt和python的流程和延迟梯度分析另外:…

html+css+js前端作业qq音乐官网5个页面 带js

htmlcssjs前端作业qq音乐官网5个页面 带js 有轮播图&#xff0c;tab切换等多种效果 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编…

Flink 实时数仓(九)【DWS 层搭建(三)交易域汇总表创建】

前言 今天立秋&#xff0c;任务是完成 DWS 剩余的表&#xff0c;不知道今天能不能做完&#xff0c;欲速则不达&#xff0c;学不完就明天继续&#xff0c;尽量搞懂每一个需求&#xff1b; 1、交易域下单各窗口汇总表 任务&#xff1a;从 Kafka 订单明细主题读取数据&#xff0…

【Linux-WMware Tools安装失败“segmentation fault”解决方法】

VMware版本&#xff1a;17 Ubuntu版本: 22.04 安装常规办法&#xff0c;通过vmware安装Tool&#xff0c;安装显示报错&#xff1a;“segmentation fault”&#xff0c;查了下可能是tool和ubuntu版本不兼容导致的。解决办法&#xff1a;通过命令行逐次安装。 1、sudo apt insta…

PostgreSQL(二十五)PG_FDW的使用

目录 一、FDW的简介与特性 二、pg_fdw的部署与使用 1、编译postgres_fdw 2、添加postgres_fdw 3、创建FDW服务器 ​4、授权并创建用户映射 5、客户端创建FDW测试表 6、访问外部表 ​7、可能出现的问题 三、FDW的执行原理 1、PG-PG访问过程描述 2、PG-PG访问过程查看…

一部分优化算法

一、优化问题 1、优化目标 &#xff08;1&#xff09;优化和深度学习的目标是根本不同的。前者主要关注的是最小化目标&#xff0c;后者则关注在给定有限数据量的情况下寻找合适的模型。 &#xff08;2&#xff09;优化算法的目标函数通常是基于训练数据集的损失函数&#x…

springboot 定义类导入爆红,@Autowried自动注入失败

springboot 定义类导入爆红&#xff0c;Autowried自动注入失败 根据提供的异常信息&#xff0c;分析如下&#xff1a; 异常起因&#xff1a;UnsatisfiedDependencyException 表示在创建名为 ‘a1001Service’ 的 bean 时存在依赖问题&#xff0c;具体是在字段 ‘a1001Mapper’ …

算法日记day 32(贪心之划分字母区间|合并区间|单调递增的数字|监控二叉树)

一、划分字母区间 题目&#xff1a; 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返回一个表示每…

nginx 405错误是什么意思

405错误&#xff1a;方法不被允许 当Web服务器收到一个它不支持的HTTP请求方法时&#xff0c;就会返回405错误。 原因 405错误通常是由于客户端发出了不兼容或不支持的HTTP请求方法。例如&#xff0c;客户端可能请求一个只能通过GET方法访问的资源&#xff0c;但使用了POST方…

C代码做底层及Matlab_SimuLink做应用层设计单片机程序

前言:SimuLink工具极其强大,但是能直接支持单片机自主开发的很少,造成这个问题的原因主要是我们使用的芯片底层多是C代码工程,芯片厂家也只提供C代码库,很少能提供SimuLink的支持库,即使提供也不是很不完善,如NXP的一些芯片提供的SimuLink库不含盖高级应用,再比如意法半…

视创云展:轻松构建出独一无二的元宇宙空间

视创云展作为一款前沿的元宇宙数字营销平台&#xff0c;集成了多项核心技术&#xff0c;旨在为用户提供低门槛、高效能的元宇宙体验与创作工具。其核心技术主要包括&#xff1a; 1、低门槛、模块化&#xff0c;3D场景创作工具 视创云展集成了海量的元宇宙场景模板&#xff0c;…

SpringBoot中如何自定义自己的过滤器Filter(简易版)

本文不再说SpringMVC中的写法&#xff0c;毕竟现在项目都是SpringBoot&#xff0c;我们还是尽量使用SpringBoot的写法&#xff0c;首先了解一下Filter。 说白了&#xff0c;就是在请求到达服务器之前进行拦截&#xff0c;一般使用场景是拦截登录进行权限校验&#xff0c;当然一…

跟李沐学AI:GoogLeNet含并行连结的网络

Inception块 GoogleNet中的基本卷积块&#xff0c;从4个路径从不同层面抽取信息&#xff0c;然后再输出通道维合并。 数据输入后共有四条路径&#xff1a;第一个路径为1x1的卷积层&#xff1b;第二个路径先用1x1的卷积层修改通道数&#xff0c;在输入到3x3的卷积层&#xff0c…

腾讯云AI代码助手助力软件开发体验分享

引言 现在&#xff0c;AI工具在软件开发中变得越来越重要&#xff0c;它们能显著提升效率和代码质量。本文就来分享一下我用腾讯云AI代码助手的经历&#xff0c;看看它是怎么在开发中帮了大忙的。 开发环境介绍 这次的项目用的是JavaScript&#xff0c;开发环境是Windows 10…

用于胰腺癌自动化综述报告和可切除性分类的大型语言模型| 文献速递-基于深度学习的乳房、前列腺疾病诊断系统

Title 题目 Large Language Models for Automated Synoptic Reports and Resectability Categorization in Pancreatic Cancer 用于胰腺癌自动化综述报告和可切除性分类的大型语言模型 Background 背景 Structured radiology reports for pancreatic ductal adenocarcinom…

condition字符串匹配问题

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 fs使用dialplan配置文件执行业务流程&#xff0c;condition条件变量的配置是必然会使用的&#xff0c;这里记录一次配置过程中的错误示范。 环境 CentOS 7.9 freeswitch 1.10.7 问题描述 dialplan配置如下&#xf…