Java 动态空检查
在对任何对象执行某些操作之前,我打算对其创建一个通用的动态空检查函数 例如:Java 动态空检查,java,Java,在对任何对象执行某些操作之前,我打算对其创建一个通用的动态空检查函数 例如: Class A{ B b; // with getters and setters of b } class B{ C c; //with getters and setters of c } class C{ BigInteger d; //with getters and setters of d } 现在,我想检查objA.getB().getC().getD()是否返回一些值或抛出NullP
Class A{
B b;
// with getters and setters of b
}
class B{
C c;
//with getters and setters of c
}
class C{
BigInteger d;
//with getters and setters of d
}
现在,我想检查objA.getB().getC().getD()
是否返回一些值或抛出NullPointerException
我的意思是,我可以向它传递任何类型的对象,比如下面的函数
CheckNull.checkingDynamicNull( "objA.getB().getC().getD()" )
将根据具体情况返回真或假
有什么想法吗?这个怎么样:
public boolean checkingDynamicNull(A objA) {
try {
objA.getB().getC().getD().toString();
} catch(NullPointerException npe) {
return true;
}
return false;
}
要知道语句是否返回
null
,必须先执行它。即使您设法对方法执行String
中给出的语句,也无异于运行它并检查结果是否为null
,或者捕获NullPointerException
,您正在寻找不久将成为Java8(或9或10?)一部分的内容。Cf.不幸的是,在Java中不可能将函数传递到方法中(然而,Java 8会这样做)。此外,如果您将变量名作为字符串传递,这将不起作用,因为Receiving方法无法知道映射到该变量的对象是什么(如果忽略反射,但即使忽略反射,如果是局部变量,也会出错)
另一种方法是这样做
boolean nullCheck(Object obj, String Methods)
if(object == null){
//error behavior
}
然后将字符串解析为方法并在对象上调用它们。但是如果你有带参数的方法,那就行不通了
简言之:这比它的价值更麻烦
在大多数情况下,你想要这样的东西
boolean nullCheck(Object obj, String Methods)
if(object == null){
//error behavior
}
这假设您想要抛出某个异常,有方法获取null对象的值,或者在抛出异常之前想做些什么。
如果您只是想抛出异常(这不是NullPointerException)
有了反射,它可能是这样的:
nullCheck(objA, "getB", "getC", "getD" );
带来
true
false
'Window(null).doLayout'
您可以通过使用反射来实现这一点,以下是您的方法:
public boolean dynamicNullCheck(Object o, String path) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
Object object= o;
for (String element : path.split("\\."))
{
Field field = object.getClass().getDeclaredField(element);
field.setAccessible(true);
Object fieldVal = field.get(object);
if (fieldVal!=null)
{
field.setAccessible(true);
object = fieldVal;
}
else
{
return true;
}
}
return false;
}
通过提供每个对象的根元素和路径来使用它,即
dynamicNullCheck(objA,“b.c.d”)
objA.getB().getC().getD()==null
@GrijeshChauhan。。如果getB()
返回了一个null
?这就是我想通过该函数返回false来处理的问题……任何使用(getter)方法的动态null检查都可能在这些方法产生副作用时失败。因此,当您单独检查每个方法时,您可能会得到最好的结果。使用反射和公共字段可以进行此检查。这听起来不是一个很好的方法。你肯定在乎哪一个是空的吗?这不会影响你处理空值的方式吗?也就是说,如果flight.family.person.baggage是空的,那可能没关系——这个人就是没有任何行李。但是如果flight.family.person为空,则表示一个家庭没有任何人-这是一个严重错误。在调用getB()
castobjA
到a
之前,我曾想过这一点,但这不是常见的函数。。。。是不是…没错,但是我觉得对一个公共Util使用这个方法没有多大意义。在特殊情况下,您应该处理null
。这个方法不能很好地处理null
。好吧,我们可以通过反射方法来解决这个问题……但我没有这方面的经验……+1因为“简言之:这比它值的麻烦多”这可能会解决我的问题,因为我不打算在方法中传递任何参数,因为它们大多是正常的getter。
public boolean dynamicNullCheck(Object o, String path) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
Object object= o;
for (String element : path.split("\\."))
{
Field field = object.getClass().getDeclaredField(element);
field.setAccessible(true);
Object fieldVal = field.get(object);
if (fieldVal!=null)
{
field.setAccessible(true);
object = fieldVal;
}
else
{
return true;
}
}
return false;
}