缺少Java的价值

时间:2012-05-30 04:51:51

标签: java

可以在Java中使用什么语句来表示变量的缺失值。例如,我想写一个代码:

if (a>=23)
 income = pay_rate;
else 
 income is missing;

11 个答案:

答案 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 Javaprovides this abstraction库。如果您对此数据类型的使用有任何疑问,我将很乐意回答。

答案 1 :(得分:6)

您正在寻找,而不是语句,并且该值为null。您无法将null分配给primitive data types的变量,例如intdouble,但您可以将其与盒装对应项一起使用 - { {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_VALUEInteger.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。另外,确保收入为IntegerDouble

答案 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));
    }
}