是否有嵌套try和catch的替代方法?

时间:2017-09-24 20:04:10

标签: java android try-catch

在下面发布的代码中,我想编写一个实用工具方法,我想检查对象是否为null,字符串为null而不是空。 所以,我编写了下面显示的方式,抛出一些异常,但我认为代码可以用更好的方式编码,因为我编码它的方式已嵌套 试着抓住积木。我认为这不是一个好的风格

请指导我更好地编码belwo方法

public static boolean isFragmentShowing(Activity activity, String tag) throws Exception {

    try {
        if (activity != null) {
            FragmentManager fragmentManager = FragmentUtils.getFragmentManagerInstance(activity);

            try {
                if (tag != null && !tag.equals("")) {
                    Fragment fragment = fragmentManager.findFragmentByTag(tag);

                    return (fragment != null && fragment.isVisible())? true : false;

                } else {
                    throw new NullPointerException("isFragmentShowing: fragment tag passed is null or empty");
                }
            } catch (NullPointerException e) {
                Log.e(TAG, "Error: " + e.getMessage().toString());
                System.exit(1);
                return false;
            }

        } else {
            throw new NullPointerException("isFragmentShowing: context reference is null");
        }
    } catch (NullPointerException e) {
        Log.e(TAG, "Error: " + e.getMessage().toString());
        System.exit(1);
        return false;
    }
}

3 个答案:

答案 0 :(得分:1)

您的申请有两部分。一个是请求验证,另一个是应用程序逻辑。单独的请求验证和应用程序逻辑。它将更容易阅读和维护。这是我在下面的尝试

public static boolean isFragmentShowing(Activity activity, String tag) throws Exception {

//validate request 
if(activity == null) {
    // throw exception or return value 
}   
if (tag == null && tag.equals("")){
    // throw exception or return value 
}
// rest of the part
FragmentManager fragmentManager = FragmentUtils.getFragmentManagerInstance(activity);
Fragment fragment = fragmentManager.findFragmentByTag(tag);
return (fragment != null && fragment.isVisible())? true : false;
}

答案 1 :(得分:1)

如果您要处理异常,那么

Log.e(TAG, "Error: " + e.getMessage().toString());

那么你不需要异常,你只需要一个字符串。正如我在上一个问题上所说,抓住NullPointerException很少是正确的做法;更一般地说,使用控制流的异常是一个非常可疑的做法。使用System.exit很少是你真正想做的事情。

您可以创建类似以下的方法:

boolean logMessageAndExit(String message) {
  Log.e(TAG, "Error: " + message);
  System.exit(1);
  return false;
}

然后调用你的代码:

if (activity == null) {
  return logMessageAndExit("isFragmentShowing: context reference is null");
}
if (tag != null && !tag.equals("")) {
  return logMessageAndExit("isFragmentShowing: fragment tag passed is null or empty");
}

Fragment fragment = fragmentManager.findFragmentByTag(tag);
return fragment != null && fragment.isVisible();

在这里返回一个布尔值只是为了方便你return它:这使编译器相信执行永远不会超过该行,即使return从未真正执行过。

(你可以让它返回一些Throwable,所以你可以throw logMessageAndExit,让它更清楚地表明它是异常的。)

答案 2 :(得分:0)

好的,这就是你的isFragmentShowing方法应该如何。 您看到我已删除所有try/catches。这是因为您的方法已经throws已经检查Exception,并且调用静态方法的代码需要将调用包含在isFragmentShowing内的try/catch中。你可以很容易地捕获NPE,甚至打印出它的堆栈跟踪,它可以让你知道哪个实例基本上是nullfragmentactivity。我们实际抛出NPE的唯一时间是tag.equals("")返回true时(因为它不会抛出异常)。
我也只用fragment != null && fragment.isVisible()替换了最后一个三元运算符的返回值,因为它意味着同样的事情(如果表达式求值为true和{{},则返回true否则返回右边的1}},为什么不返回表达式本身的结果?)

以下是代码:

false