ページの先頭行へ戻る
Interstage Studio Java EEワークベンチユーザーズガイド

7.2.5 問題の検出と修正

JavaファイルやJSPファイルなどのソースファイルの中に、エラーや警告などの問題がある場合は、その部分にマーカが設定されます。そのため、問題は、エディタのルーラー上のアイコンやソースが強調表示されることで確認できます。また、問題ビューにも一覧表示されます。マーカの情報として問題の内容が表示されているので、必要に応じて修正してください。

エラーや警告などの問題は、さまざまな機能で検出されます。問題を検出する機能を以下に示します。

7.2.5.1 Javaコンパイラ

Javaの仕様に違反しているコーディングミスだけでなく、Javaの仕様として問題は無いがトラブルの原因になる可能性がある記述をチェックすることができます。

以下にチェックする項目の概要を示します。

上記のカテゴリに属する細かいチェック項目があり、そのチェックレベルをカスタマイズすることができます。カスタマイズは、設定ページの[Java] > [コンパイラ]、またはその配下の設定ページから行います。(プロジェクト固有の設定を行う場合には、プロジェクトプロパティの[Javaコンパイラ]で行います。)

7.2.5.2 検証

以下のようにファイルやアプリケーションの妥当性を検証するバリデータが提供されており、ファイル単位やプロジェクト単位にチェックすることができます。

バリデータ

チェック内容

HTML構文バリデータ

HTMLファイルの基本構文をチェックします。

JavaScript 構文検証

HTML/JSPファイルに記述したJavaScriptの構文をチェックします。

JPAバリデータ

JPAアプリケーションとしての妥当性をチェックします。

JSP構文バリデータ

JSPファイルをJavaコードに変換してから、そのJavaコードにコンパイルエラーが無いかを検査することでJSPファイルの構文をチェックします。

JSP内容バリデータ

JSPのELやディレクティブなどをチェックします。

XMLバリデータ

XMLファイルが整形式であること、および妥当であることをチェックします。

バリデータは以下を契機に動作します。

検証の設定

検証の動作をカスタマイズすることができます。カスタマイズは、設定ページの[検証]で行います。(プロジェクト固有の設定を行う場合には、プロジェクトプロパティの[検証]で行います。)
カスタマイズは以下を参考に行ってください。

7.2.5.3 Interstage Java EE検証

以下のように、Java EE アプリケーションとしての妥当性をアーカイブファイル単位に検証することができます。

ポイント

エンタープライズアプリケーションプロジェクトをチェックすると中身のモジュールまでチェックされてしまいます。ワークスペースでエンタープライズアプリケーションとその中身のモジュールを両方作成しており、ビルド時にチェックする場合には、どちらかのみを選択してチェックが重複しないようにしてください。

Interstage Java EE検証の設定

Interstage Java EE検証の動作をカスタマイズすることができます。カスタマイズは、設定ページの[Interstage Java EE検証]で行います。(プロジェクト固有の設定を行う場合には、プロジェクトプロパティの[Interstage Java EE 検証]で行います。)
カスタマイズは以下を参考に行ってください。

7.2.5.4 FindBugs

以下のように、バグの存在する可能性があるコードを指摘するFindBugsを使用することができます。

ポイント

複数プロジェクトを選択して、コンテキストメニューから[FindBugs] > ["自動的に実行"を設定]を選択することで、まとめてビルダとして実行するように設定することもできます。

検出された問題は、以下の形式で問題ビューに表示されます。

  <警告優先度> <バグカテゴリ> <バグパターン> : <メッセージ>

また、以下のように、FindBugsで検出された問題を表示するためのビューやパースペクティブも用意されています。

チェック内容

FindBugsでは、以下のようなチェックを行っています。

バグカテゴリ

省略形

概要

実行効率

P

必ずしも間違いではないが、実行効率が悪くなる可能性のあるもの。例えば、以下のようなものを検出します。

  • URLクラスの非効率な使い方

  • Stringクラスの非効率な使い方

  • valueOfメソッドの非効率な使い方

  • ボクシング/アンボクシングの非効率な使い方

  • 使用されていないフィールド、メソッド宣言

正確性

C

明らかなコーディングミスによって、開発者の意図しないコードになっているもの。例えば、以下のようなものを検出します。

  • equalsメソッドの誤使用

  • 明らかな無限ループ

  • フィールドやメソッドなど命名に関する問題

  • nullポインタ

国際化

I

国際化、ロケールの扱いに対するコードに欠陥があるもの。例えば、以下のようなものを検出します。

  • Localeを引数に持つメソッドを利用していない

マルチスレッド環境での正確性

M

スレッド、ロック、volatileの扱いに対するコードに欠陥があるもの。

良くない習慣

B

推奨される、あるいは本質的なコーディング規範から逸脱しているもの。例えば、以下のようなものを検出します。

  • 例外の扱い方

  • 文字列の不正な比較

  • finalizerの誤使用

  • equalsメソッドの使い方

  • フィールドやメソッドなどのまぎらわしい名前

  • 直列化の問題

脆弱性を持つコード

V

信頼されていないコードからの攻撃に対して脆弱性を持つコード。例えば、以下のようなものを検出します。

  • 内部表現が流出する可能性があるもの

  • privateやfinalなど修飾子に関するもの

回避可能

D

誤解を与え易いコード、変則的、間違いを招き易いコード。例えば、以下のようなものを検出します。

  • 変数への値の設定に関するもの

  • キャストに関するもの

上記のバグカテゴリ単位にチェックする/しないをカスタマイズすることができます。

FindBugsの設定

FindBugsの動作をカスタマイズすることができます。カスタマイズは、設定ページの[FindBugs]で行います。(プロジェクト固有の設定を行う場合には、プロジェクトプロパティの[FindBugs]で行います。)

カスタマイズは以下を参考に行ってください。

プロジェクト固有の設定項目については、以下を参考に行ってください。

ポイント

複数プロジェクトを選択して、コンテキストメニューから[FindBugs] > ["自動的に実行"を設定]を選択することで、まとめてビルダとして実行するように設定することもできます。

FindBugsのフィルタファイルの書式

FindBugsでは、チェックした内容を問題として扱うかをフィルタファイルで制御することができます。例えば、FindBugsによって問題として検出されたが、コードを確認したところ問題ないことが判明した場合には、除外フィルタファイルを設定することで、以降に問題として検出されないようにすることができます。

以下にフィルタファイルで使用するタグについて説明します。

タグ

属性

説明

FindBugsFilter

フィルタファイルのトップレベルの要素です。

Match

クラスを特定するための要素です。

class

クラス名を指定します。

classregx

クラス名を正規表現で指定します。

BugCode

バグパターンの省略形を指定するための要素です。バグパターンの省略形は問題メッセージの3番目に表示されるアルファベットの組合せです。

name

バグパターンの省略形をコンマで区切って指定します。

Priority

優先度を指定するための要素です。

value

以下の値を1つ指定します。
1:高い
2:普通
3:低い

Method

メソッドを指定するための要素です。params属性とreturns属性は必須ではありませんが、指定する場合は両方指定する必要があります。

name

メソッド名を指定します。

params

引数の型の完全修飾名をコンマで区切って指定します。

returns

復帰値の型の完全修飾名をコンマで区切って指定します。

Or

OR論理演算子の役目をする要素です。

実際の除外フィルタファイルの例を示します。

<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
     <!-- ClassNotToBeAnalyzedクラスに関する問題を検出しないようにします -->
     <Match class="com.foobar.ClassNotToBeAnalyzed" />

     <!-- ClassWithSomeBugsMatchedクラスに関する以下の問題を検出しないようにします
       DE : 例外を見落としている、または無視しています。
       UrF: 参照しないフィールドがあります。
      -->
     <Match class="com.foobar.ClassWithSomeBugsMatched">
       <BugCode name="DE,UrF" />
     </Match>

     <!-- すべてのクラスに対してSQLの問題を検出しないようにします -->
     <Match classregex=".*" >
       <BugCode name="SQL" />
     </Match>

     <!-- AnotherClassクラスのnonOverloadedMethod, frob, blatメソッドに対してフィールドの二重チェックの問題を検出しないようにします -->
     <Match class="com.foobar.AnotherClass">
       <Or>
         <Method name="nonOverloadedMethod" />
         <Method name="frob" params="int,java.lang.String" returns="void" />
         <Method name="blat" params="" returns="boolean" />
       </Or>
       <BugCode name="DC" />
     </Match>

    <!-- MyClassクラスのsomeMethodに対して優先度2(普通)の意味の無いローカル変数への代入の問題を検出しないようにします -->
    <Match class="com.foobar.MyClass">
      <Method name="someMethod"/>
      <BugCode name="DLS "/>
      <Priority value="2"/>
    </Match>

</FindBugsFilter>