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博客

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来为你讲解如何编写一个Java三角形Triangle。 首先,我们需要明确一个三角形需要什么属性才能被描述出来。一般来说,三角形的属性包括三个顶点和三个边长。因此,我们可以定义一个Triangle,包含三个Point型的成员变量表示三个顶点,以及三个double型的成员变量表示三边长度。 接下来,我们需要编写Triangle的构造方法和一些常用方法。比如: 1. 构造方法 ```java public Triangle(Point p1, Point p2, Point p3) { this.p1 = p1; this.p2 = p2; this.p3 = p3; // 计算三边长度 this.a = p1.distance(p2); this.b = p2.distance(p3); this.c = p3.distance(p1); } ``` 2. 计算周长 ```java public double getPerimeter() { return a + b + c; } ``` 3. 计算面积 可以使用海龙公式计算三角形面积: ```java public double getArea() { double p = (a + b + c) / 2; return Math.sqrt(p * (p - a) * (p - b) * (p - c)); } ``` 4. 判断是否为等边三角形 ```java public boolean isEquilateral() { return a == b && b == c; } ``` 5. 判断是否为等腰三角形 ```java public boolean isIsosceles() { return a == b || b == c || c == a; } ``` 6. 判断是否为直角三角形 可以使用勾股定理判断: ```java public boolean isRightAngled() { return a * a + b * b == c * c || b * b + c * c == a * a || c * c + a * a == b * b; } ``` 7. 判断是否为锐角三角形 可以根据余弦定理判断: ```java public boolean isAcuteAngled() { return Math.cos(angleA()) > 0 && Math.cos(angleB()) > 0 && Math.cos(angleC()) > 0; } private double angleA() { return Math.acos((b * b + c * c - a * a) / (2 * b * c)); } private double angleB() { return Math.acos((c * c + a * a - b * b) / (2 * c * a)); } private double angleC() { return Math.acos((a * a + b * b - c * c) / (2 * a * b)); } ``` 以上就是一个简单的Java三角形Triangle的实现。在实际使用中,还可以根据需求添加其他方法和属性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值