2017-09-24 29 views
0

在下面发布的代码中,我正在编写一个实用程序方法,并且我想检查一个对象是否为null,并且字符串为null而不是空的。 因此,我编写了下面显示的方式抛出一些异常,但我认为代码可能已经被更好地编码,因为我编码它的方式嵌套 尝试和捕获blocks.and我不认为这是一个很好的风格是否有嵌套尝试和捕获的替代方法?

请指导我更好的代码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; 
    } 
} 
+0

为什么要抓住异常,如果你要抓住它在外面的块? –

+0

看来你所做的只是捕捉NPE。为什么不在最后抓到任何NPE。我实际上并没有捕捉到NPE,而是我检查了NPE –

+0

@Yohannes能否请你提供一些代码 – user2121

回答

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

好的尝试,这里是你的isFragmentShowing方法应该是怎么样的。 你看我已经删除了所有的try/catches。这是因为你的方法已经throws检查Exception和调用你的静态方法的代码将需要包装呼叫isFragmentShowing里面的try/catch。您可以很容易地捕捉到NPE,甚至可以打印出堆栈轨迹,从而让您知道哪个实例基本上是nullfragmentactivity
我们唯一需要真正抛出NPE的时候是tag.equals("")返回true(因为那不会抛出异常)。
我也用fragment != null && fragment.isVisible()替换了最后一个三元运算符返回,因为它意味着相同的东西(如果表达式计算结果为true,则返回true,否则返回false,为什么不返回表达式本身的结果? )

而这里的代码:

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(); 
} 
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,使它更清楚它是不正常的)。