任意一个三角形,其任意两边之和大于第三边。当三角形的三条边不满足前述条件时,就表示发生了异常,将这种异常情况定义为IllegalTriangleException类。
自定义异常类IllegalTriangleException:
-
当三角形的三条边不满足条件:“任意一个三角形,其任意两边之和大于第三边”时,就抛出该类型的异常对象。IllegalTriangleException是一个非运行时异常。
-
为IllegalTriangleException类定义带一个字符串参数的构造器,该参数表示异常对象的异常信息(Message)
class IllegalTriangleException ………… {
//定义一个构造器,带一个字符串参数,字符串表示异常信息
}
定义三角形类Triangle:
三角形类定义要求如下:
- 三个私有成员变量,side1、side2、side3,分别表示三角形的三条边;
- 一个带三个参数的构造器,用传入的三个参数初始化三角形的三条边,如果出现两条边之和小于等于第三边,则抛出 IllegalTriangleException异常对象,异常对象中包含异常信息:“无法创建三角形,三角形的两边之和要大于第三边”,并在构造器的声明中要声明抛出 IllegalTriangleException类
- 定义一个成员方法: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
我们据需求来学习异常:这道题我们看下来,有俩个疑问
- JAVA中的异常是什么
- 异常怎么使用
先进行知识的补充,再来解决问题
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异常对象。
懂了,异常就是拿来抛的。
抛的就是实例化的类,怎么抛?
抛出语句
- 先实例化
- 抛——throw 对象
- 写抛出声明
咱们根据题目来说
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.捕获
那么,前面的四个问题就是浓缩这一章的内容:
- JAVA中的异常是什么 - 也是个类
- 异常怎么使用 - 抛 / 捕获
- 抛什么 - 实例化的异常类
- 怎么抛的 - 抛出语句
接着,我们就来看看异常的捕获,以及什么时候选择抛,什么时候选择直接处理异常
Java-异常处理-处理RuntimeException(2/2)-CSDN博客