1.实验题目:
5-13修改例3.7各图形类的构造方法如下,若参数不符合要求,抛出无效参数异常。
// 构造点,若x<0或 y<0,则抛出无效参数异常
public Point(int x, int y) throws IllegalArgumentException
//以下构造矩形,若length<0或width<0,则抛出无效参数异常
public Rectangle(Point point1, int length, int width) throws IllegalArgumentException
// 以下由三点构造一个三角形;当三点共线不能构成一个三角形时,则抛出无效参数异常
Public Triangle(Point point1, Point point2, Point point3) throws IllegalArgumentException
//以下构造多边形,由points数组指定多点;若少于3点,或不能构成多边形,则抛出无效参数异常
public Polygon(Point[] points) throws IllegalArgumentException
2.实验目的:
掌握java异常处理机制及分析代码存在的异常类型
掌握throws的用法
掌握继承的机制和用法
3.实验内容:
- 实验思路
创建图形类Figure、Point
创建Figure的子类CloseFigure、Line
创建CloseFigure的子类Polygon、Triangle
创建Polygon的子类Rectangle
类的继承关系如图:
对构造点、矩形、三角形、多边形出现的参数无效异常进行处理
2.关键代码截图
- 对构造点出现的x、y<0参数异常进行处理
(2)对多边形边数小于3异常进行处理
(3)对矩形的长和宽是否都大于零判断
(4)对三个点是否能构成三角形处理,若不能抛出数据错误异常
3.运行结果
(1)计算给定三点所组成的三角形的周长和面积、给定4点的四边形的周长和面积
(2)数据正确时的运行结果
- 数据错误时的运行结果
给定三点共线不能组成三角形
4.源代码
1.Figure类
public abstract class Figure {
public Point point1;
protected Figure(Point point1){
this.point1 = point1;
}
protected Figure(int x1,int y1){
this.point1.x = x1;
this.point1.y = y1;
}
public String toString(){
return this.point1==null?"":this.point1.toString();
}
}
2.Point类
public class Point {
public int x,y;
public Point(int x, int y) throws IllegalArgumentException{
if(x<0||y<0){
throw new IllegalArgumentException("输入的x,y不能小于0");
}
this.x = x;
this.y = y;
}
public Point(){
this(0,0);
}
public Point(Point p){
this(p.x,p.y);
}
public String toString(){
return "(" + this.x + "," + this.y + ")";
}
}
3.Line类
public class Line extends Figure {
public Point point2;
public Line(Point point1, Point point2) {
super(point1);
this.point2 = point2;
}
public Line(int x1,int y1,int x2,int y2){
super(x1,x2);
this.point2.x = x2;
this.point2.y = y2;
}
public double length(){
int a= point1.x- point2.x,b = point1.y- point2.y;
return Math.sqrt(a*a +b*b);
}
@Override
public String toString() {
return "一条直线,起点" + point1.toString() + ",终点" + point2.toString()
+",长度" + String.format("%1.2f",length());
}
}
4.CloseFigure类
public abstract class ClosedFigure extends Figure{
protected String shape;
protected ClosedFigure(String shape,Point point1){
super(point1);
this.shape= shape;
}
protected ClosedFigure(){
this("",new Point());
}
public abstract double perimeter();
public abstract double area();
public void print(){
System.out.println(this.shape+this.toString()+","+String.format("周长“%1.2f,面积%1.2f"
,this.perimeter(),this.area()));
}
}
5.Polygon类
public class Polygon extends ClosedFigure{
private Point[] points;
public Polygon(Point[] points) throws IllegalArgumentException{
super("多边形",points[0]);
if(points.length<3){
throw new IllegalArgumentException("构成多边形的点数不能小于3");
}
this.points = points;
}
public String toString(){
String str = "(" + points.length + "个点" +this.points[0].toString();
for (int i = 1; i < points.length; i++) {
str += ","+this.points[i].toString();
}
return str+")";
}
public double perimeter(){
double perim = 0;
for (int i = 0; i < points.length; i++) {
perim += new Line(points[i],points[(i+1)%points.length]).length();
}
return perim;
}
public double area(){
double sum = 0;
for (int i = 1; i < points.length-1; i++) {
sum += new Triangle(points[0],points[i],points[i+1]).area();
}
return sum;
}
}
6.Triangle类
public class Triangle extends ClosedFigure{
public Point point2,point3;
protected double a,b,c;
public Triangle(Point point1,Point point2,Point point3) throws IllegalArgumentException{
super("三角形",point1);
if((point1.x- point2.x)*(point2.y- point3.y)==(point1.y - point2.y)* (point2.x- point3.x))
{
throw new IllegalArgumentException("三点共线不能构成三角形");
}
this.point2 = point2;
this.point3 = point3;
this.a = new Line(point1,point2).length();
this.b = new Line(point3,point2).length();
this.c = new Line(point1,point3).length();
}
public Triangle(Point point1,double a,double b,double c){
super("三角形",point1);
this.a = a;
this.b = b;
this.c = c;
}
public String toString(){
return "3点坐标" + super.toString()+"," + (this.point2==null?"":
this.point2.toString())+","+(this.point3==null?"":this.point3.toString()) +
",3边长"+ String.format("%1.2f,%1.2f,%1.2f)",this.a,this.b,this.c);
}
@Override
public double perimeter() {
return a+b+c;
}
@Override
public double area() {
double s = (a+b+c)/2;
return Math.sqrt(s*(s-a)*(s-b)*(s-c));
}
}
7.Rectangle类
public class Rectangle extends Polygon{
double width,length;
public Rectangle(Point[] points,double width,double length) throws IllegalArgumentException{
super(points);
if(width<0||length<0){
throw new IllegalArgumentException("矩形的长和宽要大于0");
}
this.width = width;
this.length = length;
}
@Override
public String toString() {
return "长方形有" + super.toString() + "长方形的长为:" + length + ",宽为:" +width;
}
@Override
public double perimeter() {
return 2*(width + length);
}
@Override
public double area() {
return width * length;
}
}
8.测试类
public class Exception {
public static void main(String[] args) {
Point point1 = new Point(100,100);
ClosedFigure cfig = new Triangle(point1,new Point(100,300),new Point(140,130));
cfig.print();
Point[] pentagon = {point1,new Point(200,100),new Point(200,100),new Point(140,130)};
cfig = new Polygon(pentagon);
cfig.print();
}
}