例如,我需要使用getFoo()方法获取Foo对象:

Foo foo = getFoo();

在此之后,我想处理getFoo()没有成功返回Foo对象的情况。这又包括两种情况:
  • getFoo()引发异常。
  • getFoo()的返回结果为null,空String,0或应视为“空结果”的任何内容。

  • 理想情况下,我希望getFoo()抛出异常而不是返回空结果,但是有时这可能是对我不拥有的另一个包中的方法的调用。

    这些是我能想到的方法:

    1.重复的处理代码
    Foo foo = null;
    try {
        foo = getFoo();
    } catch (ResourceNotFoundException ex) {
        logger.warn("blablabla");
        foo = defaultFoo;
        someOtherComplicatedStuff();
    }
    if (null == foo) {
        logger.warn("blablabla");
        foo = defaultFoo;
        someOtherComplicatedStuff();
    }
    

    这绝对不是一个好主意。

    2.将处理逻辑移至单个功能
    Foo foo = null;
    try {
        foo = getFoo();
    } catch (ResourceNotFoundException ex) {
        handleNullFoo(var1, var2, var3, var4);
    }
    if (null == foo) {
        handleNullFoo(var1, var2, var3, var4);
    }
    

    问题在于逻辑可能使用很多局部变量。将这些变量传递给外部函数没有多大意义。更糟糕的是,在此过程中可能需要修改某些变量。我认为修改函数中的参数不是一个好习惯,更不用说参数是原始类型时可能引起的问题。

    3.抛出一个假异常
    Foo foo = null;
    try {
        foo = getFoo();
        if (null == foo) {
            throw new ResourceNotFoundException();
        }
    } catch (ResourceNotFoundException ex) {
        logger.warn("blablabla");
        foo = defaultFoo;
        someOtherComplicatedStuff();
    }
    

    到目前为止,这是最干净的方法,但更像是一种hack。在异常类不属于的包中抛出ResourceNotFoundException可能不合适。由于人们可能没有意识到异常是在函数内部处理的,因此它也降低了代码的可读性。

    那么,您有什么建议?

    非常感谢你!

    最佳答案

    这是另一种选择:

    Foo foo = null;
    try {
        foo = getFoo();
    } catch (ResourceNotFoundException ex) {
        //TODO: log exception?
        foo = null;
    }
    
    if (null == foo) {
        logger.warn("blablabla");
        foo = defaultFoo;
        someOtherComplicatedStuff();
    }
    

    注意,foo = null;子句中的catch几乎肯定是不必要的。仅当foo = getFoo()之后有一些可以抛出ResourceNotFoundException的代码时才需要。

    关于java - 如何在Java中统一处理“Exception或null”情况?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14387434/

    10-09 05:12