4

これがコードの一部です。

  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 ブロックから特定の値を返す必要がありますか、それとも使用法は正しいですか?

4

7 に答える 7

10

このコードは正しく、疑わしくはありません。解析が失敗した場合 (この場合、可能な限り狭い例外をキャッチする必要があることに注意してください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;
        }
    }
于 2012-07-26T07:51:47.570 に答える
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;
}
于 2012-07-26T07:59:03.157 に答える
2

何を返したいのか分かっていれば大丈夫だと思います。あなたが使用する出口(リターン)の数についてヒントを与えることができれば. ブール値フィールドを使用し、try / catch ブロックの後に 1 回だけ戻ります

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;
  }
于 2012-07-26T07:56:40.233 に答える
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;}
于 2012-07-26T08:06:41.230 に答える
1

catch ブロックや、finally ブロックでも値を返すことができます。

全然大丈夫です。

于 2012-07-26T07:52:16.860 に答える
1

の条件の 1 つが整数でなければならない場合、コードは問題ありませんが、整数であることを期待CheckTermしていてそうでない場合は、例外をスローした方がよいでしょう。lNumberlNumber

于 2012-07-26T07:52:31.070 に答える
1

例外を別の方法でキャッチしますが、そのままで問題ありません。

あなたの呼び出しがNumberFormatExceptionをスローするそのメソッド

false を返すだけで問題ないようです。例外を処理する方法について説明しますが、例外を追跡するために何らかのログを記録します。

于 2012-07-26T07:53:03.850 に答える