[英]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
。 fragment
或activity
。
我们真正需要抛出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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.