动态空检查

时间:2013-02-15 09:41:34

标签: 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()是返回某个值还是抛出NullPointerException

通常我的意思是我可以传递任何类型的对象,如下面的函数

CheckNull.checkingDynamicNull( "objA.getB().getC().getD()" ) 
根据具体情况,

会返回true或false。

有什么想法吗?

6 个答案:

答案 0 :(得分:1)

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

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

boolean nullCheck(Object obj, String Methods)

然后将String解析为Methods并在对象上调用它们。但是如果你有带参数的方法那就不行。

简而言之:这比值得更麻烦

在大多数情况下,您希望拥有类似的内容

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

这假设您要抛出某个异常,有方法获取空对象elswhere的值,或者想要在抛出异常之前执行某些操作。 如果您只想抛出异常(不是NullPointerException)

assert object != null

答案 1 :(得分:0)

这个怎么样:

public boolean checkingDynamicNull(A objA) {
    try {
        objA.getB().getC().getD().toString();
    } catch(NullPointerException npe) {
        return true;
    }
    return false;
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分: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'

答案 5 :(得分: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")