如何在 Java 的构造函数中为变量设置条件值?
How to set a condition value for a variable in the constructor in Java?
我正在尝试为变量价格创建一个不小于 0 的条件,以便使用构造函数有效
这是我的代码
public void setPrice(){
if(price > 0){
System.out.println("Valid value");}
else{
System.out.println("Error");} }
除了 if 语句之外,还有其他方法吗?
I want to make sure that the value of price cant be less than 0 [...].
Is there a different way to do it other than if statement?
没有
但是,您所做的只是打印一条错误消息并继续使用无效值。那没有达到你的要求。
这是我认为你应该做的:
public void setPrice(int price){
if (price <= 0) {
throw new IllegalArgumentException("price not > 0");
}
// set the price
}
如果price
值无效,则抛出异常并“中断”正常的流程控制。您可以在(例如)调用此方法的方法中捕获并处理异常。根据使用代码的位置,异常处理程序可能会要求用户提供正确的值、拒绝当前请求、跳过输入文件中的“记录”等。但是这样做的逻辑......甚至报告问题的逻辑都不是 setPrice
方法的关注点。该方法只负责检查和设置价格
或者,您可以让应用程序终止。这就是这里会发生的事情。 IllegalArgumentException
是一个未经检查的异常,这意味着编译器不会坚持要求您对其进行处理。
您可以在构造函数中做同样的事情。但请注意,如果构造函数因异常而终止,则它创建的对象将不会完全初始化。一般都是扔掉的。
@Jay Anderson 建议使用 assert
。这是一个可能的解决方案,但在这里可能不合适。问题是可以通过命令行选项关闭对 assert
断言的检查。 (事实上,断言检查默认是“关闭”的)
您不希望人们能够关闭对用户提供的值的检查。
您不希望人们能够关闭对其他人软件提供的值的检查。
您不希望人们能够关闭对系统其他部分提供的值的检查。
真的,断言只有在您确定它在生产中 运行 没有执行检查的情况下是正确的......根本没有。我的建议是根本不要使用它们。而是使用(单独的)单元测试来找出代码中的问题。
下面是您定义的构造函数的一些伪代码。
public nameOfClass(type param){
if(param > 0){
throw new IllegalArgumentException("Error parameter may not be lower than 0");
}
}
如果您不希望参数小于零,我相信这就是构造函数的工作方式
我也相信 if 语句几乎肯定是解决这个问题的最佳方法。
如果这是内部检查(例如,如果不是正价格,则此时是编程错误),您可以使用 assert
。类似于:
assert price > 0 : "Price must be positive."
如果这是检查外部生成的输入,则异常是更好的选择:
if (price <= 0) { throw new IllegalArgumentException("Price must be positive"); }
这仍然使用if
。这些类型的验证方法通常放在实用方法中。例如番石榴有 Preconditions
:
Preconditions.checkArgument(price > 0, "Price must be positive");
最后是验证框架,您可以在其中设置对象并检查是否满足所有条件(示例:http://beanvalidation.org/)
我正在尝试为变量价格创建一个不小于 0 的条件,以便使用构造函数有效
这是我的代码
public void setPrice(){
if(price > 0){
System.out.println("Valid value");}
else{
System.out.println("Error");} }
除了 if 语句之外,还有其他方法吗?
I want to make sure that the value of price cant be less than 0 [...].
Is there a different way to do it other than if statement?
没有
但是,您所做的只是打印一条错误消息并继续使用无效值。那没有达到你的要求。
这是我认为你应该做的:
public void setPrice(int price){
if (price <= 0) {
throw new IllegalArgumentException("price not > 0");
}
// set the price
}
如果price
值无效,则抛出异常并“中断”正常的流程控制。您可以在(例如)调用此方法的方法中捕获并处理异常。根据使用代码的位置,异常处理程序可能会要求用户提供正确的值、拒绝当前请求、跳过输入文件中的“记录”等。但是这样做的逻辑......甚至报告问题的逻辑都不是 setPrice
方法的关注点。该方法只负责检查和设置价格
或者,您可以让应用程序终止。这就是这里会发生的事情。 IllegalArgumentException
是一个未经检查的异常,这意味着编译器不会坚持要求您对其进行处理。
您可以在构造函数中做同样的事情。但请注意,如果构造函数因异常而终止,则它创建的对象将不会完全初始化。一般都是扔掉的。
@Jay Anderson 建议使用 assert
。这是一个可能的解决方案,但在这里可能不合适。问题是可以通过命令行选项关闭对 assert
断言的检查。 (事实上,断言检查默认是“关闭”的)
您不希望人们能够关闭对用户提供的值的检查。
您不希望人们能够关闭对其他人软件提供的值的检查。
您不希望人们能够关闭对系统其他部分提供的值的检查。
真的,断言只有在您确定它在生产中 运行 没有执行检查的情况下是正确的......根本没有。我的建议是根本不要使用它们。而是使用(单独的)单元测试来找出代码中的问题。
下面是您定义的构造函数的一些伪代码。
public nameOfClass(type param){
if(param > 0){
throw new IllegalArgumentException("Error parameter may not be lower than 0");
}
}
如果您不希望参数小于零,我相信这就是构造函数的工作方式
我也相信 if 语句几乎肯定是解决这个问题的最佳方法。
如果这是内部检查(例如,如果不是正价格,则此时是编程错误),您可以使用 assert
。类似于:
assert price > 0 : "Price must be positive."
如果这是检查外部生成的输入,则异常是更好的选择:
if (price <= 0) { throw new IllegalArgumentException("Price must be positive"); }
这仍然使用if
。这些类型的验证方法通常放在实用方法中。例如番石榴有 Preconditions
:
Preconditions.checkArgument(price > 0, "Price must be positive");
最后是验证框架,您可以在其中设置对象并检查是否满足所有条件(示例:http://beanvalidation.org/)