如何在Try-Catch中继续使用If-Conditions

时间:2012-03-07 10:43:53

标签: java try-catch

我有这行代码

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字符串,尽管其中至少有一个字符串设置为非空字符串。

所以问题是,我怎样才能继续尝试块,尽管有一个异常被捕获?

非常感谢。

7 个答案:

答案 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 ){
    ...
}