我有这个主要课程:
import java.util.Scanner;
public class Rec
{
public static void main(String[] args)
{
rectangle myRectangle = new rectangle();
float w;
float h;
Scanner input = new Scanner (System.in);
System.out.println("Please enter the width of the rectangle");
w = input.nextFloat();
myRectangle.setWidth(w);
//if(myRectangle.width)
System.out.println("Please enter the height of the rectangle");
h = input.nextFloat();
myRectangle.setHeight(h);
System.out.println("The Perimeter of a rectanle having height of " +myRectangle.height + " and width of " + myRectangle.width + " is " + myRectangle.FindPerimeter());
//System.out.println(myRectangle.width);
//System.out.println(myRectangle.FindPerimeter());
//System.out.println(myRectangle.FindArea());
}
}
我下面有这个矩形类。如何对其进行编码,以便当用户输入的数字大于20或小于0时,程序会要求用户再次输入?这是矩形类:
package rec;
public class rectangle
{
float width=1;
float height=1;
float perimeter;
public void setWidth(float w)
{
if(w<20 && w>0)
width = w;
else
{
System.out.println("invalid entry, please try again: ");
//setWidth(w);
}
}
public void setHeight(float h)
{
if(h<20 && h>0)
height = h;
else
{
System.out.println("invalid entry, please try again: ");
//setWidth(h);
}
}
public float getWidth()
{
return width;
}
public float getHeight()
{
return height;
}
public float FindPerimeter()
{
return (width+height)*2;
}
public float FindArea()
{
return width*height;
}
}
提前致谢!
答案 0 :(得分:2)
不要在你的二传手中做。如果你这样做,你将“模型”和你的“输入”混合在一个类中,所以如果你想改变它(比如从文件中读取),那就更难了。
更改您的主叫代码:
h = -1;
while(h < 0 || h > 20) {
System.out.println("Please enter the height of the rectangle");
h = input.nextFloat();
}
myRectangle.setHeight(h);
另一种方法是尝试设置高度并使函数在成功时返回true或在失败时返回false - 这样所有验证都在一个地方
bool done = false;
while(!done) {
System.out.println("Please enter the height of the rectangle");
h = input.nextFloat();
done = myRectangle.setHeight(h);
}
public bool setHeight(float h)
{
bool ok = false;
if(h<20 && h>0) {
height = h;
ok = true;
}
return ok;
}
答案 1 :(得分:1)
让setHeight
返回boolean
来指示高度是否有效是一种可能的解决方案。但是有一些缺点:
(1)如果您在致电setHeight
时忘记检查结果,您的程序会认为一切正常,而setHeight
实际上失败了。这在Java中太容易了,因为你可以调用一个方法并丢弃结果:
setHeight(40.0);
// keep going as if everything were hunky dory
(2)如果我没有弄错,有些框架期望“setter”方法有无效结果。我认为这是在“bean”的定义中。
我的方法是添加测试有效性的方法:
public class rectangle
{
float width=1;
float height=1;
float perimeter;
public boolean isValidWidth(float w) {
return (w < 20 && w > 0);
}
public void setWidth(float w)
{
if(isValidWidth(w)) {
width = w;
} else {
throw new IllegalArgumentException("Invalid width");
}
}
// and similarly for height
}
然后调用代码将变为:
boolean done = false;
while(!done) {
System.out.println("Please enter the width of the rectangle");
w = input.nextFloat();
done = myRectangle.isValidWidth(w);
}
myRectangle.setWidth(w);
或
do {
System.out.println("Please enter the width of the rectangle");
w = input.nextFloat();
} while (!myRectangle.isValidWidth(w)); // keep going as long as width is *not* valid
myRectangle.setWidth(w);
如果程序忘记首先进行有效性检查,则throw
存在。如果呼叫者尝试呼叫setWidth(w)
并且w
无效,则程序将不会继续,就好像一切正常一样。相反,程序会因异常而死(或者会在其他地方捕获异常)。
但这两种解决方案都将有效性检查放在rectangle
所属的位置;所以我认为两者都比要求来电者知道界限更好。