在Java中,在if条件的同一行中添加Null检查并访问整数值是否有效
说 这样检查有效吗在Java中,在if条件的同一行中添加Null检查并访问整数值是否有效,java,if-statement,null-check,Java,If Statement,Null Check,说 这样检查有效吗 class Person{ Integer height; integer weight; } 是,这是有效的,因为Integer是表示int的类 这就是为什么Integer可以保存空值的原因。比较p.height和p.weight也是有效的。。如果你想要干净的代码,请考虑这个问题: 高度为空实际上意味着什么?这是否意味着: 它在语义上等价于0。(那么,为什么要有它呢?将字段设置为int,并正确设置它们) 这是未知的 它是不稳定的;这是一个不希望自己的身高
class Person{
Integer height;
integer weight;
}
是,这是有效的,因为Integer是表示int的类
这就是为什么
Integer
可以保存空值的原因。比较p.height
和p.weight
也是有效的。。如果你想要干净的代码,请考虑这个问题:
高度为空实际上意味着什么?这是否意味着:
- 它在语义上等价于0。(那么,为什么要有它呢?将字段设置为
,并正确设置它们)int
- 这是未知的
- 它是不稳定的;这是一个不希望自己的身高被公开的人
- 将身高和体重保密
- 如果试图设置0或负身高或体重,他们的二传手将拒绝设置(并抛出
)IllegalArgumentException
- 字段的类型为
int
- 存在各种替代状态的常数
公共类人物{
私有静态final int UNKNOWN=-1;
私有静态final int_省略=-2;
身高、体重;
公众人士(){
这个高度=未知;
这个重量=未知;
}
公共空间设置高度(内部高度){
如果(高度<1)抛出新的IllegalArgumentException(“非正高度”);
高度=高度;
}
公共无效设置高度省略(){
此高度=故意省略;
}
}
等等。现在您可以编写固有可读性的代码
null
是模糊的(您必须记录它的含义。它是指未设置、无效还是故意省略?什么?)如果(高度==故意省略)
记录自身,这是一件好事。是的,因为在&&operation的情况下,如果第一个条件为真,那么第二个条件之后将被检查。如果p.height
为空,则第一个条件为false,因此不会检查其他条件
您还必须为
p.width
添加空检查。这是否回答了您的问题?在我看来没问题,确保身高和体重得到初始化,否则你会得到一个空指针exceptionTL;DR:是的,这很好,因为一旦发现&&
的左侧为false,将不会计算右侧。(顺便说一句,您仅涵盖高度,您可能还需要添加重量检查)是的,因为&&
和|
运算符执行如果(x!=null&&x.someMethod())
是有效和安全的,因为如果第一部分x!=null
的计算结果为false(x为null),则不再计算该语句的其余部分,因为无论发生什么情况,false&……
始终为false。但是,在上面的示例中,您不检查p.weight
是否也为空。因此,当代码达到p.weight>=1
且权重为null
时,您可能会得到NullPointerException
,如果需要注意&&
运算符的关联性和短路行为,请注意完整性的抖动+1.我发现了有关短路行为的文件。
Person p = new Person();
if (p.height !=null && p.height >= 1 && p.weight >=1 ){}
public class Person {
private static final int UNKNOWN = -1;
private static final int INTENTIONALLY_OMITTED = -2;
private int height, weight;
public Person() {
this.height = UNKNOWN;
this.weight = UNKNOWN;
}
public void setHeight(int height) {
if (height < 1) throw new IllegalArgumentException("Non-positive height");
this.height = height;
}
public void setHeightOmitted() {
this.height = INTENTIONALLY_OMITTED;
}
}