有一个圆形和长方形。
都有获取面积。如果面积出现非法的数值,视为是获得面积出现异常
问题通过异常来表示。
现在对这个程序进行基本设计
方法一:本人写的
public class Rectangle {
private int length;
private int width;
Rectangle(int length,int width ){
this.length=length;
this.width=width;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
}
public class Circle {
private double radius;
Circle (double radius){
this.radius=radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
}
public class FeiZhengException extends RuntimeException {
private String message;
FeiZhengException(String message){
super(message);
}
}
public class Test {
public int area(Rectangle re) {
if(re.getLength()<=0|re.getWidth()<=0) {
throw new FeiZhengException("输入参数有非正数");
}
return re.getWidth()*re.getLength();
}
public double area(Circle ci) {
if(ci.getRadius()<=0) {
throw new FeiZhengException("输入参数有非正数");
}
return 3.14*ci.getRadius()*ci.getRadius();
}
}
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Rectangle re=new Rectangle(3,2);
Test t=new Test();
System.out.println("长方形的面积为:"+t.area(re));
Circle ci=new Circle(-7);
System.out.println("圆形的面积为:"+t.area(ci));
}
}
改进后的代码①:自定义异常类继承异常类
将求面积这个方法,作为一个附加方法,放到接口中
如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常,所以若实现类抛出异常,则接口必须抛出异常
public interface Shape {
public abstract void area() throws NoValueException;
}
public class NoValueException extends Exception {
private String message;
NoValueException(String message){
super(message);
}
}
public class Rectangle implements Shape {
private int length;
private int width;
public Rectangle(int length,int width ){
/*if(length<=0||width<=0) {
System.out.println("错了");
}
else {
this.length=length;
this.width=width;
}
*不能这样做,原因是成员变量都是含有各自的默认值的,所以即使用户输入的数据是错误
*的,在这提示“错了”,该调用的面积方法照样会执行,输出0,这是不符合常理的,
*因为如果出现负数或者零,这个长方形就不存在,就不应该计算面积。
*
*犯得错误是:正常流程代码和问题处理代码关系紧密,阅读性差
*
*只保留正常流程代码,当问题发生时,再进行写问题处理代码
*/
this.length=length;
this.width=width;
}
public void area() throws NoValueException //如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常
{
// TODO Auto-generated method stub
if(length<=0||width<=0) {
throw new NoValueException("输入了非法值!!");
}
System.out.println( "长方形的面积为:"+width*length);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Rectangle re=new Rectangle(-3,2);
try {
re.area();
} catch (NoValueException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
改进代码三:自定义异常继承RuntimeException类
其实当输入负值时,这个对象就不应该建立成功,程序应立刻停止
public interface Shape {
public abstract void area() ;
}
public class Rectangle implements Shape {
private int length;
private int width;
public Rectangle(int length,int width ){
if(length<=0||width<=0) {
throw new NoValueException("输入了非法值!!");
}
this.length=length;
this.width=width;
}
public void area() //如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常
{
// TODO Auto-generated method stub
System.out.println( "长方形的面积为:"+width*length);
}
}
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Rectangle re=new Rectangle(-3,2);
re.area();
}
}