Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态空检查_Java - Fatal编程技术网

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()
cast
objA
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;


}