我有这行代码
try {
String txtText = article.getTxtText().toString();
if (StringUtils.hasText(article.getTxtText().toString())){
textPropertyList.add(txtText);
}
String txtLongText = article.getObjLongTextData().toString();
if (StringUtils.hasText(txtLongText)){
textPropertyList.add(txtLongText);
}
String txtShortText = article.getObjShortTeaserData().toString();
if (StringUtils.hasText(txtShortText)) {
textPropertyList.add(txtShortText);
}
} catch (NullPointerException e) {
}
有可能只设置了三个属性中的一个。但是如果没有设置一个属性,我会得到这个NullpointerException。我抓住它,但然后try-Block不继续。
所以,例如如果article.getTxtText()方法返回null,我也不会得到txtLongText和txtShortText字符串,尽管其中至少有一个字符串设置为非空字符串。
所以问题是,我怎样才能继续尝试块,尽管有一个异常被捕获?
非常感谢。
答案 0 :(得分:6)
您应该使用3个try-catch块,或者只是在每个案例周围使用空检查。
if (article.getTxtText() != null) {
// do part 1
}
if (article.getObjLongTextData() != null) {
// do part 2
}
答案 1 :(得分:3)
我认为正确的方法是在每个代码点周围有三个try / catch块。 try块的重点在于你将代码视为一个块,如果它在任何地方都失败了你就放弃了它。对于你所描述的内容,你需要围绕每个可能的失败点进行三次尝试/捕获。
据说你最好不要测试null而不是依赖异常处理来做到这一点。异常处理应该是异常事件,而不是程序中的流控制。
答案 2 :(得分:2)
如果您必须使用例外(我认为您不应该这样做),那么您需要有3个单独的try / catch块:
try {
String txtText = article.getTxtText().toString();
if (StringUtils.hasText(article.getTxtText().toString())){
textPropertyList.add(txtText);
}
} catch (NullPointerException e) {}
try {
String txtLongText = article.getObjLongTextData().toString();
if (StringUtils.hasText(txtLongText)){
textPropertyList.add(txtLongText);
}
} catch (NullPointerException e) {}
try {
String txtShortText = article.getObjShortTeaserData().toString();
if (StringUtils.hasText(txtShortText)) {
textPropertyList.add(txtShortText);
}
} catch (NullPointerException e) {}
一旦在代码中抛出异常,就无法在try
块的中间重新开始执行。
话虽如此,我总是希望用if
测试来检测空指针,而不是依赖异常处理这种非异常情况。
答案 3 :(得分:1)
执行defensive programming,检查空值。
if ( variable != null ){
...
}
答案 4 :(得分:0)
从我的观点来看,最简单和更好的方法是在三个不同的try-catch块中打破try-catch块,如下所示:
try {
String txtText = article.getTxtText().toString();
if (StringUtils.hasText(article.getTxtText().toString())){
textPropertyList.add(txtText);
}
} catch (NullPointerException e) {
//Handle Exception
}
try {
String txtLongText = article.getObjLongTextData().toString();
if (StringUtils.hasText(txtLongText)){
textPropertyList.add(txtLongText);
}
} catch (NullPointerException e) {
//Handle Exception
}
try {
String txtShortText = article.getObjShortTeaserData().toString();
if (StringUtils.hasText(txtShortText)) {
textPropertyList.add(txtShortText);
}
} catch (NullPointerException e) {
//Handle Exception
}
答案 5 :(得分:0)
我建议采用不同的设计:
private void addProperty(Object property, Collection<String> properties) {
if (property == null) {
return;
}
String textProperty = property.toString();
if (StringUtils.hasText()) {
properties.add(textProperty);
}
}
用法:
addProperty(article.getTxtText());
// ...
答案 6 :(得分:-1)
为什么要在try / catch中执行此操作,只需使用简单的if
if ( txtText != null ){
...
}
if ( txtLongText != null ){
...
}