java - 在 Java 中更改函数的返回值
问题描述
我有一个类似以下的功能:
public static double calculateValuationByTransmission(double price, char transmission) {
if (transmission == 'A') {
return price * 0.05;
} else if (transmission == 'M') {
return price * -0.05;
} else {
System.out.println("Transmission must be: 'A' or 'M'");
return 0;
}
}
如您所见,当输入参数transmission
未收到预期值时,此函数会显示错误消息。此外,它返回0。我想在另一个函数中使用这个函数,如下所示:
public static double calculateValuation(double price, int mileage, int age, char transmission) {
if (price < 0.0 || mileage < 0 || age < 0) {
System.out.println("Price, mileage and age must be a positive number");
return -1;
}
//HERE
double valueTransmission = PAC1Ex2.calculateValuationByTransmission(price, transmission);
if (valueTransmission == 0.0){
return -1;
}
double preuIntermedi = price - (valueTransmission +
PAC1Ex2.calculateValuationByMileage(price, mileage));
double preuDevaluacio = PAC1Ex2.calculateValuationByAge(preuIntermedi,age);
System.out.println("Your vehicle is now valued at " + preuDevaluacio +"€");
return preuDevaluacio;
}
但是,当我运行代码时,我可以看到该消息,但我没有返回 -1。我试图将返回值匹配为 0.0,然后将其更改为 -1 但这不起作用(请参阅 //HERE 注释后面的代码)。哪一个是最好的方法?
提前致谢
解决方案
要返回特定状态,您基本上有四个选项:
您可以使用常量:
public static final [type] [varname] = [value];
. 这用于特定的消息/状态,也可以与类一起使用。您可以使用可选:
Optional<Integer>
. 这仅适用于类。返回Optional.empty();
以指示不良状态。要指示无效的返回值,您也可以简单地使用包装类。当您使用
double
时,包装类将是Double
. 因此return null;
,每当您检索该值时Double valueTransmission = PAC1Ex2.calculateValuationByTransmission(price, transmission); if (valueTransmission == null){ return -1; // or even better, also return null here if applicable }
正如@Socowi 指出的那样,您还可以使用异常来表示严重错误的输入值。所以我重写了你的代码以使用异常处理:
代码:
public class PAC1Ex2 {
// define our own exception here
static public class InvalidTransmissionException extends IllegalArgumentException {
private static final long serialVersionUID = 1421105202322188571L;
public InvalidTransmissionException(final String pMessage) {
super(pMessage);
}
}
public static double calculateValuationByTransmission(final double price, final char transmission) {
if (transmission == 'A') {
return price * 0.05;
} else if (transmission == 'M') {
return price * -0.05;
} else {
throw new InvalidTransmissionException("Transmission [" + transmission + "] invalid! Transmission must be: [A] or [M]!");
// System.out.println("Transmission must be: 'A' or 'M'");
// return 0;
}
}
public static double calculateValuation(final double price, final int mileage, final int age, final char transmission) {
if (price < 0.0 || mileage < 0 || age < 0) {
System.out.println("Price, mileage and age must be a positive number"); // we also could use exceptions here
return -1;
}
//HERE
try {
final double valueTransmission = PAC1Ex2.calculateValuationByTransmission(price, transmission);
final double preuIntermedi = price - (valueTransmission + PAC1Ex2.calculateValuationByMileage(price, mileage));
final double preuDevaluacio = PAC1Ex2.calculateValuationByAge(preuIntermedi, age);
System.out.println("Your vehicle is now valued at " + preuDevaluacio + "€");
return preuDevaluacio;
} catch (final InvalidTransmissionException e) {
return -1;
// or even pass that exception up forther by a) not catching it, or b) writing "throw e;"
}
}
private static double calculateValuationByAge(final double pPreuIntermedi, final int pAge) {
// TODO Auto-generated method stub // dummy method
return 0;
}
private static double calculateValuationByMileage(final double pPrice, final int pMileage) {
// TODO Auto-generated method stub // dummy method
return 0;
}
}
警告:浮点数和双精度值的比较总是通过一些容差测试来完成,所以这可能会产生奇怪的结果。还要小心对 Double.NaN 进行测试,因为您不能比较像这样的值,if (x == Double.NaN) ...
而是必须使用Double.isNaN(x)
.
通常你应该首先使用 Wrappers,如果一个异常状态就足够了。如果您需要更多,请使用常量。
推荐阅读
- javascript - 在 Reactjs 的非功能组件中使用自定义钩子
- git - git 是否将更改后的大文件完全上传到远程,或者可以只上传差异?
- sas - 数一数。从元数据中观察 SAS 数据集
- java - 如何将 p6spy 与 proxydatasource 一起使用
- c# - IProgressDialog 不显示选取框样式
- mysql - MySQL:如何在忽略几个数据库的情况下恢复转储
- macos - 在批处理模式下找不到 Stata 命令
- x86 - AMD 处理器的分层自上而下性能分析
- caching - 删除 x-cart 缓存文件是否安全?
- dictionary - 传单 - 如何在拖放时匹配标记和折线(通过鼠标单击新的标记和线)