错误的异常使用 - 来自catch的返回值

时间:2012-07-26 07:45:54

标签: java exception

这是一段代码。

  private boolean CheckTerm()
      {
          String str = lGskCompoundNumber;
          if (lPrefix.trim() == "" || lNumber.trim() == "")
              return false;

          try
          {
              Integer.parseInt(lNumber);
          }
          catch (Exception ex)
          {
              return false;
          }
          if (lHasAmpersand)
              str = lGskCompoundNumber.replace("&", "");
          return str.equals(lPrefix + lInitSep + lNumber + lEndSep + lSuffix);
      }

我应该从catch块返回某个值还是使用权?

7 个答案:

答案 0 :(得分:9)

此代码是正确的,看起来并不可疑。解析失败时(请注意,您应该捕获尽可能最窄的异常,在这种情况下为NumberFormatException),整个验证失败,因此您将返回false。否则,您将执行其他检查(在catch阻止之后)并返回其结果。这段代码很好。

如果您觉得有点难以阅读,请考虑以下重构:

private boolean checkTerm() {
    try
        {
            String str = lGskCompoundNumber;
            if (lPrefix.trim() == "" || lNumber.trim() == "")
                return false;
            Integer.parseInt(lNumber);
            if (lHasAmpersand)
                str = lGskCompoundNumber.replace("&", "");
            return str.equals(lPrefix + lInitSep + lNumber + lEndSep + lSuffix);
        }
        catch (NumberFormatException ex)
        {
            return false;
        }
    }

答案 1 :(得分:3)

你的代码没有任何问题,但我总是喜欢在我的方法中有一个退出点,所以我更喜欢这样写:

private boolean CheckTerm()
{
    boolean res = false;
    String str = lGskCompoundNumber;
    if (lPrefix.trim() == "" || lNumber.trim() == "")
    {
    }
    else
    {
        try
        {
            Integer.parseInt(lNumber);
            if (lHasAmpersand)
                str = lGskCompoundNumber.replace("&", "");
            res = str.equals(lPrefix + lInitSep + lNumber + lEndSep + lSuffix);
        }
        catch (NumberFormatException ex)
        {
        }

    }
    return res;
}

答案 2 :(得分:2)

我相信如果你知道你想要回归什么就没问题。 如果我可以提供您使用的退出(退货)数量的提示。 我会使用一个布尔字段,然后在try / catch Block

之后返回一次
private boolean CheckTerm()
{
  boolean b = true;
  String str = lGskCompoundNumber;
      if (lPrefix.trim() == "" || lNumber.trim() == "")
          b = false;

      try
      {
          Integer.parseInt(lNumber);
      }
      catch (Exception ex)
      {
          b =  false;
      }
      if (lHasAmpersand)
          str = lGskCompoundNumber.replace("&", "");
      b = str.equals(lPrefix + lInitSep + lNumber + lEndSep + lSuffix);
      return b;
  }

答案 3 :(得分:1)

你可以在catch块中返回一些值,甚至在finally块中返回。

完全可以。

答案 4 :(得分:1)

如果CheckTerm的一个条件是lNumber应该是一个整数,那么你的代码就可以了,但如果你期望lNumber是一个整数而它不是,你最好抛出异常。

答案 5 :(得分:1)

虽然我会以不同的方式捕捉异常,但它很好。

您的通话方法会抛出NumberFormatException

好像只是返回false就好了,我会做某种日志来跟踪异常discussion on how to handle your exception

答案 6 :(得分:1)

如果您担心没有默认返回,请使用finally,然后返回一些内容。

try
    {
        Integer.parseInt(lNumber);
        if (lHasAmpersand)
            str = lGskCompoundNumber.replace("&", "");
        res = str.equals(lPrefix + lInitSep + lNumber + lEndSep + lSuffix);
    }
    catch (NumberFormatException ex)
    {
       return false;
    }finally{return false;}