可以在Java中使用什么语句来表示变量的缺失值。例如,我想写一个代码:
if (a>=23)
income = pay_rate;
else
income is missing;
答案 0 :(得分:14)
这个帖子中有很多不好的建议。首先让我解释为什么你应该不采取一些建议的方法。
<强> 1。使用包装器类型和null
Integer income = null;
if (a >= 23) {
income = payRate;
}
Java具有自动拆箱功能。如果你在某个地方意外地在一个Java必须自动取消装箱的地方使用income
怎么办?编译器无法捕获此错误,您的代码将在运行时爆炸。
其次,收入的“可空性”不是income
类型的一部分。因此,程序员每次使用时都要小心检查null
。如果他忘记执行此检查,编译器将不会抱怨,但您将在运行时获得NullPointerException
。
<强> 2。使用标记值表示异常情况
int income = Integer.MAX_VALUE;
if (a >= 23) {
income = payRate;
}
这种方法具有null
方法的第二个缺点。更糟糕的是,在这种情况下,即使在错误的情况下,计算也将继续,而不是抛出异常,因为Integer.MAX_VALUE
是有效的int
,导致可能的灾难性后果。< / p>
那你该怎么处理呢?
使用以下数据类型:
Maybe
(也称为Option
)适合该法案。 (@Bahribayli已经建议过了。我正在扩展它。)请参阅数据定义here。
这就是你如何在你的情况下使用它:
Maybe<Integer> income = Nothing.value();
if (a >= 23) {
income = Just.of(payRate);
}
有一个名为Functional Java的provides this abstraction库。如果您对此数据类型的使用有任何疑问,我将很乐意回答。
答案 1 :(得分:6)
您正在寻找值,而不是语句,并且该值为null
。您无法将null
分配给primitive data types的变量,例如int
和double
,但您可以将其与盒装对应项一起使用 - { {3}},Integer
等等。
执行此操作时,在访问null
之前,请务必检查if (pay_rate > 100)
的值。否则,看起来无辜的{{1}}可能会抛出空引用异常。
答案 2 :(得分:3)
Option
类型是一种指定变量类型的方法,该变量可能具有或不具有有意义的值。某些语言支持Option
类型,例如Scala的scala.Option
类型。对于不支持该类型的语言,您可以使用包装类或基元的盒装副本。
public class Income {
private int value;
public Income(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
...
Income income = null;
if( a >= 23)
income = new Income(pay_rate);
或只是
Integer income = null;
if( a >= 23)
income = pay_rate;
答案 3 :(得分:2)
Integer income = null;
if (a >= 23) {
income = payRate; // underscores are generally considered bad convention in Java
}
答案 4 :(得分:2)
您可以将收入设置为null。之后,当您检查收入的价值时,如果它为空,则将其视为缺失
Integer income = a>=53?pay_rate:null;
答案 5 :(得分:2)
Double income = null;
if (a>=23) {income = pay_rate; }
默认情况下收入为null
,所以如果未初始化
答案 6 :(得分:2)
如此处的其他内容所述,您可以使用盒装类型。但我建议您查找数据的有效值,并选择任何无效值。在您收入的特定情况下,不能为负数,因此您可以选择-1。
避免盒装类型的原因是性能。我并不反对使用它们,但如果没有它们就可以工作,那么就没有必要使用它们了。
对于大多数+ ve和-ve值都是有效值的情况,请使用Integer.MAX_VALUE
或Integer.MIN_VALUE
作为缺失值。您将松开所有可用值范围中的一个值。
注意:自动装箱(从原语隐式转换为盒装类型,反之亦然)是一个很好的功能,但可能会导致一些难以调试和查找的性能问题。
答案 7 :(得分:2)
使用throws:
if (a>=23)
income = pay_rate;
else
throw new IllegalArgumentException("income is missing");
答案 8 :(得分:0)
你也可以试试这个,也许只是我喜欢的方式,但取决于你:p
if(a >= 23){
income = payRate;
} else{
income = null;
}
默认情况下,不是将其设置为null
,而是在检查null
之后将其设置为a
。另外,确保收入为Integer
或Double
答案 9 :(得分:0)
您需要使用null
Double income = null;
if (a>=23)
{
income = pay_rate;
}
答案 10 :(得分:0)
您可以按照以下方式执行此操作:
public abstract class Nullable extends Number {
protected final boolean isNA;
protected Nullable(boolean isNA) {
this.isNA = isNA;
}
public boolean isNA() {
return isNA;
}
}
public final class NullableInt extends Nullable {
public static final NullableInt NA = new NullableInt(0, true);
private final int value;
public NullableInt(int value, boolean isNA) {
super(isNA);
this.value = value;
}
public static NullableInt of(int value) {
return new NullableInt(value, false);
}
public int getValue() {
if (!isNA) {
return value;
}
throw new RuntimeException("Value is NA");
}
@Override
public int intValue() {
return getValue();
}
@Override
public long longValue() {
return getValue();
}
@Override
public float floatValue() {
return getValue();
}
@Override
public double doubleValue() {
return getValue();
}
}
public class Test {
public static void main(String[] args) {
NullableInt[] nullableInts = new NullableInt[3];
nullableInts[0] = NullableInt.of(1);
nullableInts[1] = NullableInt.of(2);
nullableInts[2] = NullableInt.NA;
System.out.println(Arrays.toString(nullableInts));
}
}