繁体   English   中英

是否有另一种嵌套尝试和捕获的方法?

[英]Is there an alternative way for nested try and catch?

在下面发布的代码中,我想编写一个实用程序方法的代码,我想检查一个对象是否为null以及字符串是否为null而不为空。 因此,我对下面显示的方式进行了编码,但抛出了一些异常,但是我认为可以对编码进行更好的编码,因为我的编码方式嵌套了try和catch块。

请指导我更好地编码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;
    }
}

您的应用程序分为两部分。 一个是请求验证,另一个是应用程序逻辑。 单独的请求验证和应用程序逻辑。 这将更易于阅读和维护。 这是我的尝试

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;
}

如果您要处理的唯一例外是

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 ,以使其更清楚地表明它是异常的)。

好的,这就是您的isFragmentShowing方法的样子。 您会看到我已经删除了所有try/catches 这是因为您的方法已经throws了一个检查到的Exception并且调用您的静态方法的代码仍需要isFragmentShowing的调用包装在try/catch内部。 您可以很容易地将NPE捕获在那里,甚至可以打印出其堆栈跟踪信息,从而使您知道哪个实例实质上为null fragmentactivity
我们真正需要抛出NPE的唯一时间是当tag.equals("")返回true (因为这不会抛出异常)。
我也换成了刚刚过去的三元运算符返回fragment != null && fragment.isVisible()因为这意味着同样的事情( true如果表达式的计算结果为返回truefalse ,右边是返回,否则,为什么不返回表达式本身的结果?)

这是代码:

public static boolean isFragmentShowing(Activity activity, String tag) throws Exception {
    FragmentManager fragmentManager = FragmentUtils.getFragmentManagerInstance(activity);

    if (tag.equals("")) {
        throw new NullPointerException("isFragmentShowing: fragment tag passed is empty");
    }

    Fragment fragment = fragmentManager.findFragmentByTag(tag);

    return fragment != null && fragment.isVisible();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM