0

何らかの作業を行う前に、任意のオブジェクトに対して一般的な動的 null チェック関数を作成するつもりです。

例えば:

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 を返します。

何か案は?

4

6 に答える 6

1

残念ながら、関数を Java のメソッドに渡すことはできません (ただし、Java 8 では可能です)。また、変数名を文字列として渡すと、受信メソッドはその変数にマップされているオブジェクトを知る方法がないため、これは機能しません (リフレクションを無視しても、それがローカル変数の場合は台無しになります)。

別の方法は、このようなことをすることです

boolean nullCheck(Object obj, String Methods)

次に、文字列をメソッドに解析し、オブジェクトで呼び出します。ただし、引数を持つメソッドがある場合は機能しません。

要するに:それは価値があるよりも面倒です

ほとんどの場合、このようなものが必要です

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

これは、特定の例外をスローしたい、他の場所で null オブジェクトの値を取得する手段がある、または例外をスローする前に何かをしたいことを前提としています。単に例外をスローしたい場合 (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

ステートメントが を返すかどうかを知るには、nullまずそれを実行する必要があります。メソッドに指定されたステートメントを何らかのString方法で実行できたとしても、それを実行して結果がnullであるかどうかを確認するか、NullPointerException.

于 2013-02-15T09:47:28.193 に答える
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 に答える
0

まもなく Java 8 (または 9 または 10?) に含まれるものを探しています。参照。http://viralpatel.net/blogs/null-safe-type-java-7-nullpointerexception/

于 2013-02-15T09:50:55.620 に答える
0

you can achieve this by using reflection, here is your method:

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;


}

use it by giving your root element and path to each object, ie dynamicNullCheck(objA,"b.c.d")

于 2013-02-15T10:35:45.600 に答える