« Stamp あるいは Schema を編集しただけの場合 | トップページ | カルテ保存後ウインドウを閉じる(多分完結編) »

2009年10月25日 (日)

FindBugs に指摘されたこと

  1. FindBugs 曰く「このメソッドは、データベースリソース(例えば、コネクションや結果セット)を生成しますが、それをフィールドに代入したり、他のメソッドに渡したり、戻り値として返送したりしておらず、このメソッドを起点とする実行経路の中にクローズが行われない経路があります」

    dao/SqlDaoBean.java

    protected int getHospNum() {
     ・
     ・        
      try {
        con = getConnection();
        st = con.createStatement();
        ResultSet rs = st.executeQuery(sql);
        if (rs.next()) {
          hospNum = rs.getInt(1);
        }
      }  catch (SQLException e) {
        processError(e);
      }  catch (Exception e) {
        processError(e);
      } finally {
    //↓ FindBugs に指摘された
        closeConnection(con);
        closeStatement(st);
    //↑
      }
     ・
     ・
    
  2. FindBugs曰く「このメソッドの中にあるswitch文には、同じコードがあります。単なるコードの重複かもしれませんが、コーディングミスの可能性もあります」

    client/KartePane.java 他

    private void controlMenus(ActionMap map) {
      // 各Stateはenableになる条件だけを管理する
      switch (curState) {
      
        case NONE:
          break;
    
        case SOA:
          // SOAPaneにFocusがありテキスト選択がない状態
          if (getTextPane().isEditable()) {
            map.get(GUIConst.ACTION_PASTE).setEnabled(canPaste());
            map.get(GUIConst.ACTION_INSERT_TEXT).setEnabled(true);
            map.get(GUIConst.ACTION_INSERT_SCHEMA).setEnabled(true);
          }
          break;
    
        case SOA_TEXT:
        case P_TEXT: // ←ここに持ってきた
          // SOAPaneにFocusがありテキスト選択がある状態
          map.get(GUIConst.ACTION_CUT).setEnabled(getTextPane().isEditable());
          map.get(GUIConst.ACTION_COPY).setEnabled(true);
          boolean pasteOk = (getTextPane().isEditable() && canPaste()) ? true : false;
          map.get(GUIConst.ACTION_PASTE).setEnabled(pasteOk);
          break;
    
        case P:
          // PPaneにFocusがありテキスト選択がない状態
          if (getTextPane().isEditable()) {
            map.get(GUIConst.ACTION_PASTE).setEnabled(canPaste());
            map.get(GUIConst.ACTION_INSERT_TEXT).setEnabled(true);
            map.get(GUIConst.ACTION_INSERT_STAMP).setEnabled(true);
          }
          break;
    
    //  case P_TEXT:  // こっちは pasteOk が boolean 宣言されないけど,同じことみたい
    //    // PPaneにFocusがありテキスト選択がある状態
    //    map.get(GUIConst.ACTION_CUT).setEnabled(getTextPane().isEditable());
    //    map.get(GUIConst.ACTION_COPY).setEnabled(true);
    //    pasteOk = (getTextPane().isEditable() && canPaste()) ? true : false;
    //    map.get(GUIConst.ACTION_PASTE).setEnabled(pasteOk);
    //    break;
    
  3. FindBugs 曰く「Exceptionが発生しないのにExceptionをキャッチしています。このtry-catchブロックはtry節の中でExceptionをスローしないのにExceptionのキャッチ節があり・・・」

    Exception を catch するのに,いろいろある Exception をいちいち catch するのは面倒くさいので,まとめて catch (Exception e) で処理していたのだが,FindBugs にそれはだめだと指摘された。そこで,ものすごい数だったけど全部 Exception を書き直してみたところ,確かに今まで見なかった Exception が catch されたりした。しかし,大きな問題になるようなものはなかったので,結局無駄骨だった。でも勉強になったからよしとする。

  4. FindBugs 曰く「compareTo(...)を宣言し、Object.equals()を使用しています。このクラスは、compareTo(...)を宣言していますがequals()をjava.lang.Objectから継承しています。一般にcompareToが0を返す条件は、equalsがtrueを返す条件と一致する必要があります。これを守らないと複雑で予測不可能な問題が、例えばPriorityQueueで発生するでしょう。Java 5では、PriorityQueue.remove()は、compareTo()を使用していますがJava 6では、equals()を使用しています」

    言われたとおり,(x.compareTo(y)==0) == (x.equals(y)) となるように,equals を実装する。必要ないような気もする。

    infomodel/AllergyModel.java 他

     /**
      * 同定日で比較する。
      * @param other 比較対象オブジェクト
      * @return 比較値
      */
    public int compareTo(Object other) {
      if (other != null && getClass() == other.getClass()) {
        String val1 = getIdentifiedDate();
        String val2 = ((AllergyModel)other).getIdentifiedDate();
        return val1.compareTo(val2);
      }
      return 1;
    }
    //↓
    @Override
    public boolean equals (Object other) {
      if ((other instanceof AllergyModel) && compareTo(other) == 0) {
        return true;
      } else {
        return false;
      }
    }
    //↑
    
  5. 他にもたくさん

« Stamp あるいは Schema を編集しただけの場合 | トップページ | カルテ保存後ウインドウを閉じる(多分完結編) »

OpenDolphin」カテゴリの記事