0

我打算在对任何对象进行一些工作之前对其进行通用动态空检查功能。

例如:

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()" ) 

将根据情况返回真或假。

有任何想法吗?

4

6 回答 6

1

不幸的是,不可能将函数传递给 Java 中的方法(然而,Java 8 会)。此外,如果您将变量名称作为 String 传递,这将不起作用,因为接收方法无法知道什么 Object 映射到该变量(如果您忽略反射,但即使它是局部变量,您也会被搞砸)。

另一种方法是做这样的事情

boolean nullCheck(Object obj, String Methods)

然后将字符串解析为方法并在对象上调用它们。但是,如果您有带参数的方法,那将不起作用。

简而言之:麻烦多于值得

在大多数情况下,您希望拥有这样的东西

if(object == null){
    //error behavior
}

这假设您想要抛出某个异常,有办法在其他地方获取空对象的值,或者想要在抛出异常之前做一些事情。如果你只是想抛出一个异常(那不是 NullPointerException)

assert object != null
于 2013-02-15T09:59:54.567 回答
0

那这个呢:

public boolean checkingDynamicNull(A objA) {
    try {
        objA.getB().getC().getD().toString();
    } catch(NullPointerException npe) {
        return true;
    }
    return false;
}
于 2013-02-15T09:45:43.637 回答
0

您可以通过使用反射来实现这一点,这是您的方法:

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")

于 2013-02-15T10:35:45.600 回答
0

要知道语句是否会返回null,您必须先执行它。即使您以某种方式设法执行了在String您的方法中给出的语句,这也与运行它并检查结果是否为null. 或捕获NullPointerException.

于 2013-02-15T09:47:28.193 回答
0

您正在寻找即将成为 Java 8(或 9 或 10?)的一部分的东西。参照。http://viralpatel.net/blogs/null-safe-type-java-7-nullpointerexception/

于 2013-02-15T09:50:55.620 回答
0

通过反射,它可能是这样的:

nullCheck(objA, "getB", "getC", "getD" );

public static boolean nullCheck(Object obj, String... methods) {
    Object o = obj;
    Class<?> clazz = obj.getClass();
    Method method = null;
    try {
        for( String name : methods ) {
            method = clazz.getMethod( name, null );
            o = method.invoke( o, null );
            clazz = method.getReturnType();
        }
    } catch( NullPointerException e ) {
        System.err.println(clazz.getSimpleName()+"(null)."+method.getName());
        return false;
    } catch( NoSuchMethodException e ) {
        e.printStackTrace();
    } catch( SecurityException e ) {
        e.printStackTrace();
    } catch( IllegalAccessException e ) {
        e.printStackTrace();
    } catch( IllegalArgumentException e ) {
        e.printStackTrace();
    } catch( InvocationTargetException e ) {
        e.printStackTrace();
    }
    return true;
}

System.out.println(nullCheck(GraphicsEnvironment.getLocalGraphicsEnvironment(), "getDefaultScreenDevice", "getDisplayMode", "toString"));
System.out.println(nullCheck(GraphicsEnvironment.getLocalGraphicsEnvironment(), "getDefaultScreenDevice", "getFullScreenWindow", "doLayout"));

带来

true
false

'Window(null).doLayout'
于 2013-02-15T10:34:16.960 回答