在下面发布的代码中,我想编写一个实用工具方法,我想检查对象是否为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;
}
}
答案 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,甚至打印出它的堆栈跟踪,它可以让你知道哪个实例基本上是null
。 fragment
或activity
。我们实际抛出NPE的唯一时间是tag.equals("")
返回true
时(因为它不会抛出异常)。
我也只用fragment != null && fragment.isVisible()
替换了最后一个三元运算符的返回值,因为它意味着同样的事情(如果表达式求值为true
和{{},则返回true
否则返回右边的1}},为什么不返回表达式本身的结果?)
以下是代码:
false