Javadocとは、ソースコードに書いた専用のコメントから、HTML形式のAPI仕様書を自動で作るJava標準の仕組みです。 コメントは /** で始めて */ で閉じ、1文目に要約、続けて詳しい説明、最後に @param や @return などのタグを並べます。仕様書を作るコマンドは javadoc -d docs -sourcepath src -encoding UTF-8 パッケージ名 です。

この記事では、全タグの一覧表、要素別のコピペ用テンプレート、javadocコマンドのオプション、文字化け対策、ビルドツールやIDEでの生成手順、新しい書き方({@snippet} とMarkdownコメント)、警告・エラーの直し方をまとめます。コマンドの出力は OpenJDK 21.0.10 の javadoc で実行したものです。Markdownコメントと外部スニペットは JDK 25.0.4.1 の javadoc で確認しました。タグの仕様は、Oracle公式の「JavaDoc Documentation Comment Specification(JDK 25)」と javadoc コマンドのマニュアルを今回開いて確認しています。

Javadocの早見表

やりたいこと 書き方
Javadocコメントを書く 宣言の直前に /** 説明 */
引数を説明する @param 引数名 説明
戻り値を説明する @return 説明
例外を説明する @throws 例外クラス名 発生する条件
型パラメータを説明する @param <T> 説明
別のクラスやメソッドへリンクする {@link クラス名#メソッド名(引数の型)}
コードの断片を等幅で書く {@code null}
非推奨を示す @deprecated 代わりに使うもの と @Deprecated アノテーション
追加されたバージョンを示す @since 1.2
親の説明を引き継ぐ {@inheritDoc}
サンプルコードを載せる {@snippet : コード }(Java 18以降)
HTMLを生成する javadoc -d docs -sourcepath src -encoding UTF-8 -docencoding UTF-8 -charset UTF-8 com.example.stock
見出しを日本語にする -locale ja_JP を付ける
Mavenで生成する mvn javadoc:javadoc
Gradleで生成する gradle javadoc(出力先は build/docs/javadoc)

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Javadocの書き方|タグ一覧(@param,@return)と生成コマンド」

Javadocコメントの基本の形

通常のコメントとの違い

種類 書き方 Javadocの対象
行コメント // 説明 対象外
ブロックコメント /* 説明 */ 対象外
Javadocコメント /** 説明 */ 対象
Markdownコメント(Java 23以降) /// 説明 対象

/** のようにアスタリスクが2つで始まるコメントだけがJavadocとして読み取られます。書く場所は、クラス・インタフェース・record・enum・コンストラクタ・メソッド・フィールドの宣言の直前です。アノテーションがある場合は、アノテーションよりも前に書きます。

コメントの3つの部分

/**
 * 在庫を取り出し、残りの数を返します。        ← (1) 要約(最初の1文)
 *
 * <p>在庫が足りない場合は例外になります。      ← (2) 詳しい説明(HTMLが使える)
 *
 * @param code 備品コード                      ← (3) ブロックタグ
 * @param quantity 取り出す数
 * @return 取り出したあとの在庫数
 * @throws IllegalStateException 在庫が足りない場合
 */
public int take(String code, int quantity) { ... }
部分 内容 ポイント
要約 最初の1文 一覧表(Method Summary)にそのまま表示される。句点「。」までが1文として扱われる
詳しい説明 2文目以降 段落は <p> で区切る。<ul> <li> <pre> などのHTMLが使える
ブロックタグ @ で始まる行 説明のあとにまとめて書く。行頭に置く

各行の先頭のアスタリスクとその前の空白は、生成時に取り除かれます。

書くときに気をつける文字

説明文はHTMLとして扱われるため、次の文字はそのまま書くとエラーや警告の原因になります。

書きたい文字 書き方
< や >(例: List<String>、0 < n) {@code List<String>}、{@code 0 < n}、または &lt; &gt;
& &amp; または {@code a & b}
@(行頭や、タグと解釈される位置) {@literal @}
コメントを閉じる記号(アスタリスクとスラッシュの並び) &#42;/ のように文字参照にする

タグ一覧:ブロックタグ

ブロックタグは、説明のあとに行頭から書くタグです。JDK 25の仕様書に載っている全16種を、書ける場所と導入バージョン付きでまとめます。「書ける場所」の略号は、モ=モジュール、パ=パッケージ、型=クラス・インタフェース・record・enum、コ=コンストラクタ、メ=メソッド、フ=フィールド です。

タグ 意味 書ける場所 導入 慣習的な順
@author 名前 作成者。出力には -author オプションが必要 モ・パ・型 JDK 1.0 1
@version 版 バージョン。出力には -version オプションが必要 モ・パ・型 JDK 1.0 2
@param 名前 説明 引数、型パラメータ(<T>)、recordの構成要素 型・コ・メ JDK 1.0 3
@return 説明 戻り値 メ JDK 1.0 4
@throws 例外 説明 発生する例外と条件 コ・メ JDK 1.2 5
@exception 例外 説明 @throws と同じ意味の別名 コ・メ JDK 1.0 5
@see 参照先 関連項目へのリンク すべて JDK 1.0 6
@since 版 追加されたバージョン すべて JDK 1.1 7
@serial 説明 直列化されるフィールドの説明 パ・型・フ JDK 1.2 8
@serialField 名前 型 説明 serialPersistentFields の構成要素 フ JDK 1.2 8
@serialData 説明 writeObject などが書き出すデータの説明 メ JDK 1.2 8
@deprecated 説明 非推奨の理由と代わりの手段 モ・型・コ・メ・フ JDK 1.0 9
@hidden その要素を生成結果に載せない 型・メ・フ JDK 9 ―
@provides サービス 説明 モジュールが提供するサービス モ JDK 9 ―
@uses サービス 説明 モジュールが利用するサービス モ JDK 9 ―
@spec URL タイトル 関連する外部仕様へのリンク すべて JDK 20 ―

「慣習的な順」は、広く使われている並べ方(作成者 → バージョン → 引数 → 戻り値 → 例外 → 参照 → 追加バージョン → 直列化 → 非推奨)を番号にしたものです。今回確認した仕様書には並び順の規定は見当たらず、どの順で書いても生成結果の見出し順は javadoc が整えます。チーム内でそろえておくと、ソースを読むときに探しやすくなります。

よく使う5つのタグの書き方

タグ 書き方の例 コツ
@param @param quantity 取り出す数。1以上 引数の宣言順に、すべての引数を書く。範囲や null の可否を添える
@return @return 取り出したあとの在庫数 void のメソッドには書かない
@throws @throws IllegalStateException 在庫が足りない場合 「どんなときに」発生するかを書く
@see @see #add(String, int) 同じクラスのメンバーは # から書ける
@deprecated @deprecated 1.2 から {@link #count(String)} を使ってください。 @Deprecated アノテーションと必ずセットにする

タグ一覧:インラインタグ

インラインタグは、波かっこで囲んで文中に書くタグです。全12種を一覧にします。

タグ 意味 導入
{@code 文字列} 等幅で表示し、HTMLやタグとして解釈しない JDK 1.5
{@literal 文字列} HTMLやタグとして解釈せずそのまま表示(等幅にはしない) JDK 1.5
{@link 参照先 ラベル} 別の要素へのリンク(等幅) JDK 1.2
{@linkplain 参照先 ラベル} 別の要素へのリンク(通常の書体) JDK 1.4
{@value} / {@value クラス#定数} 定数の値を表示。書式指定は JDK 20 で追加 JDK 1.4
{@inheritDoc} オーバーライド元の説明を取り込む。JDK 22 から取り込み元の型を指定可能 JDK 1.4
{@docRoot} 生成結果のルートへの相対パス JDK 1.3
{@index 語句 説明} 検索用の索引に語句を登録 JDK 9
{@summary 文} 要約を明示的に指定(最初の1文の自動抽出の代わり) JDK 10
{@systemProperty 名前} システムプロパティ名として索引に登録 JDK 12
{@return 説明} 要約文と戻り値の説明を1回で書く。説明の先頭にだけ置ける JDK 16
{@snippet ...} サンプルコードを埋め込む JDK 18

リンクの参照先の書き方

{@link} と @see の参照先は同じ形式です。

参照したいもの 書き方
同じクラスのメソッド {@link #add(String, int)}
同じクラスのフィールド {@link #MAX_QUANTITY}
別のクラス {@link Item} または {@link java.util.Map}
別のクラスのメソッド {@link Item#code()}
表示する文字を変える {@link #count(String) 在庫数の取得}
外部のWebページ(@see のみ) @see <a href="https://example.com/">説明</a>

今回の実行では、{@link Map} と書いた箇所が、JDK 21のAPIドキュメント(docs.oracle.com)へのリンクとして出力されました。標準ライブラリのクラスは、特に設定しなくてもリンクになります。

そのまま使えるテンプレート集

次の3ファイルは、実際に javadoc を実行して警告なしで生成できたものです。src/com/example/stock/ に置いて使います。

クラス・コンストラクタ・メソッド・フィールドのテンプレート

// src/com/example/stock/StockService.java
package com.example.stock;

import java.util.HashMap;
import java.util.Map;

/**
 * 備品の在庫数を管理するクラスです。
 *
 * <p>在庫はメモリ上の {@link Map} に保持します。
 * 使い方は次のとおりです。
 *
 * {@snippet :
 * StockService service = new StockService();
 * service.add("pen", 10);
 * int left = service.take("pen", 3);   // @highlight substring="take"
 * }
 *
 * @author RJC Sample
 * @version 1.2
 * @since 1.0
 * @see Item
 */
public class StockService {

    /** 1回の操作で扱える最大数({@value})。 */
    public static final int MAX_QUANTITY = 1000;

    private final Map<String, Integer> stock = new HashMap<>();

    /**
     * 空の在庫でサービスを作成します。
     */
    public StockService() {
    }

    /**
     * 在庫を追加します。
     *
     * @param code 備品コード。{@code null} は指定できません
     * @param quantity 追加する数。1以上 {@value #MAX_QUANTITY} 以下
     * @throws IllegalArgumentException {@code quantity} が範囲外の場合
     * @throws NullPointerException {@code code} が {@code null} の場合
     */
    public void add(String code, int quantity) {
        if (code == null) throw new NullPointerException("code");
        if (quantity < 1 || quantity > MAX_QUANTITY) throw new IllegalArgumentException("quantity");
        stock.merge(code, quantity, Integer::sum);
    }

    /**
     * 在庫を取り出し、残りの数を返します。
     *
     * @param code 備品コード
     * @param quantity 取り出す数
     * @return 取り出したあとの在庫数
     * @throws IllegalStateException 在庫が足りない場合
     * @see #add(String, int)
     * @since 1.1
     */
    public int take(String code, int quantity) {
        int now = stock.getOrDefault(code, 0);
        if (now < quantity) throw new IllegalStateException("在庫不足");
        stock.put(code, now - quantity);
        return now - quantity;
    }

    /**
     * {@return 指定した備品の在庫数} 登録がない場合は0です。
     *
     * @param code 備品コード
     */
    public int count(String code) {
        return stock.getOrDefault(code, 0);
    }

    /**
     * 在庫数を返します。
     *
     * @param code 備品コード
     * @return 在庫数
     * @deprecated 1.2 から {@link #count(String)} を使ってください。
     */
    @Deprecated(since = "1.2")
    public int getCount(String code) {
        return count(code);
    }
}

recordのテンプレート

recordでは、構成要素(かっこの中の項目)をクラスのコメントの @param で説明します。型パラメータは @param <T> と書きます。

// src/com/example/stock/Item.java
package com.example.stock;

/**
 * 備品1件を表すレコードです。
 *
 * @param code 備品コード
 * @param name 備品名
 * @param <T> 付加情報の型
 * @param extra 付加情報
 * @since 1.0
 */
public record Item<T>(String code, String name, T extra) {
}

パッケージのテンプレート

パッケージの説明は、package-info.java という名前のファイルに書きます。

// src/com/example/stock/package-info.java
/**
 * 備品の在庫を管理するクラスをまとめたパッケージです。
 *
 * @since 1.0
 */
package com.example.stock;

要素別に書くタグの早見表

要素 必ず書きたいもの 必要に応じて
クラス・インタフェース 要約、役割の説明 @param <T>、@author、@version、@since、@see
record 要約、構成要素ごとの @param @param <T>、@since
コンストラクタ 要約、@param @throws
メソッド 要約、@param、@return(void 以外)、@throws @see、@since、@deprecated
フィールド・定数 要約(1行で十分) {@value}、@since
enumの定数 定数ごとに1行の要約 ―
パッケージ package-info.java に要約 @since

継承元の説明を引き継ぐinheritDoc

オーバーライドしたメソッドでは、{@inheritDoc} と書くと親の説明を取り込めます。インタフェース Repo の save に説明・@param・@return を書き、実装クラス側で次のように書いて生成しました。

    /**
     * {@inheritDoc}
     *
     * <p>この実装では再起動すると内容が消えます。
     */
    @Override
    public int save(String name) {
        return 1;
    }

生成結果(-locale ja_JP を指定)には、親の「備品名を保存します。」に続いて「この実装では再起動すると内容が消えます。」が表示され、「パラメータ: name - 備品名」「戻り値: 採番したID」も親から引き継がれました。コメントを書かずにオーバーライドした場合も、不足している部分は親の説明が自動で使われます。追記したい内容があるときだけ {@inheritDoc} を使うと、重複を減らせます。

javadocコマンドで生成する

基本のコマンド

javadoc -d docs -sourcepath src \
  -encoding UTF-8 -docencoding UTF-8 -charset UTF-8 \
  -author -version \
  com.example.stock

実行時の出力(OpenJDK 21.0.10、抜粋):

Loading source files for package com.example.stock...
Constructing Javadoc information...
Creating destination directory: "out1/"
Building index for all the packages and classes...
Standard Doclet version 21.0.10+7-Ubuntu-124.04
Building tree for all the packages and classes...
Generating out1/com/example/stock/Item.html...
Generating out1/com/example/stock/StockService.html...
Generating out1/com/example/stock/package-summary.html...
(中略)
Generating out1/index.html...
Generating out1/help-doc.html...

出力先の index.html をブラウザで開くと、仕様書を確認できます。生成されたHTMLには <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> が入っていました。

対象の指定方法

対象 コマンド
パッケージを指定 javadoc -d docs -sourcepath src com.example.stock
サブパッケージもまとめて javadoc -d docs -sourcepath src -subpackages com.example
ファイルを直接指定 javadoc -d docs src/com/example/stock/StockService.java
オプションをファイルにまとめる javadoc @opts.txt com.example.stock

オプションが増えてきたら、1行に1つずつ書いたテキストファイルを @ファイル名 で渡すと便利です。

-d docs
-sourcepath src
-encoding UTF-8
-docencoding UTF-8
-charset UTF-8
-locale ja_JP
-windowtitle "在庫API"

このファイルを渡して生成すると、index.html のタイトルが <title>在庫API</title> になりました。

主なオプション一覧

オプション 意味
-d ディレクトリ HTMLの出力先。省略するとカレントディレクトリ
-sourcepath パス ソースを探すディレクトリ
-subpackages パッケージ 指定したパッケージとその下をまとめて対象にする
-encoding 名前 ソースファイルの文字コード
-docencoding 名前 出力するHTMLファイルの文字コード
-charset 名前 HTMLの meta に書く文字コード名
-locale ja_JP 見出しなどの言語。省略時は実行環境のロケール
-author / -version @author / @version の内容を出力に含める
-public / -protected / -package / -private 出力する範囲。既定は -protected(publicとprotected)
-link URL 外部のJavadocへリンクする
-windowtitle 文字列 ブラウザのタイトル
-doctitle 文字列 概要ページの見出し
-overview ファイル 概要ページの本文にするファイル
-Xdoclint:グループ コメントの検査内容。all、none、accessibility、html、missing、reference、syntax
-Werror 警告が1件でもあればエラー終了にする
-quiet 警告とエラー以外のメッセージを出さない
-notimestamp HTML内のタイムスタンプを出さない(差分が安定する)
-nodeprecated 非推奨のAPIを出力から除く
-use 「使用」ページ(どこで使われているか)を作る
-tag 名前:場所:見出し 独自のブロックタグを定義する
--snippet-path パス 外部スニペットを探す場所を追加する
--release バージョン 指定したJavaのバージョン向けとして処理する

確認できた動作をいくつか挙げます。

  • -author と -version を付けないと、@author と @version は出力されません。付けた場合だけ「Author:」「Version:」の項目が出ました。
  • privateなフィールドは既定では出力されません。-private を付けると、stock フィールドも出力されました。
  • -locale ja_JP を付けると、見出しが「パラメータ:」「戻り値:」「例外:」「関連項目:」「導入されたバージョン:」になり、HTMLの lang 属性も ja になりました。付けない場合は、今回の環境では英語(Parameters: など)でした。
  • {@return 指定した備品の在庫数} は、英語ロケールでは「Returns 指定した備品の在庫数.」、-locale ja_JP では「指定した備品の在庫数を返します。」 と出力されました。日本語で書くなら -locale ja_JP と組み合わせると自然な文になります。

文字化けを防ぐ3つのオプション

日本語のコメントで文字化けやエラーが出るときは、文字コードの指定を確認します。関係するオプションは3つです。

オプション 何の文字コードか 省略したとき
-encoding 読み込むソースファイル Javaの既定の文字コード(file.encoding)で読む
-docencoding 書き出すHTMLファイル -encoding と同じになる
-charset HTMLの meta タグに書く名前 ―

ソースがUTF-8なら -encoding UTF-8 -docencoding UTF-8 -charset UTF-8 の3つをそろえて指定するのが確実です。

ソースと指定が合わないときのエラーを再現する

Shift_JIS(CP932)で保存したソースを -encoding UTF-8 で読ませると、次のエラーで終了しました(終了コード1)。

sj/demo/Sj.java:4: error: unmappable character (0x8D) for encoding UTF-8

同じソースに -encoding MS932 -docencoding UTF-8 -charset UTF-8 を指定すると正常に生成でき、HTMLには日本語が正しく入りました。

反対に、UTF-8のソースをShift_JISとして読ませた場合です。既定の文字コードがMS932の環境を再現するため、Linux上で -J-Dfile.encoding=MS932 を付け、-encoding を省略して実行しました。

src/com/example/stock/package-info.java:2: error: unmappable character (0x86) for encoding windows-31j

症状別の対処表

症状 原因 対処
unmappable character ... for encoding UTF-8 ソースがShift_JISなのにUTF-8で読んでいる -encoding MS932 を指定する、またはソースをUTF-8で保存し直す
unmappable character ... for encoding windows-31j(または MS932) ソースがUTF-8なのに、既定のShift_JISで読んでいる -encoding UTF-8 を指定する
生成は成功するが、ブラウザで日本語が読めない HTMLの文字コードと meta の指定が合っていない -docencoding UTF-8 -charset UTF-8 をそろえる
コンソールのメッセージだけ読めない コンソールの文字コードの違い 生成結果には影響しない。-J-Dstdout.encoding=UTF-8 などで調整する

JDK 18以降は既定の文字コードがUTF-8になったため(一般に知られた仕様で、今回Windows上では未実行です)、新しいJDKでは -encoding を省略しても動くことが増えました。それでも、JDKのバージョンや環境が変わっても同じ結果になるよう、3つのオプションを明示しておくと安心です。

Maven・Gradle・Eclipse・IntelliJで生成する

Gradle

Gradle 8.14.3 で、次の build.gradle を使って gradle javadoc javadocJar を実行し、生成できることを確認しました。

plugins {
    id 'java'
}

java {
    withJavadocJar()   // build時に stock-javadoc.jar も作る
}

tasks.withType(JavaCompile).configureEach {
    options.encoding = 'UTF-8'
}

javadoc {
    options.encoding = 'UTF-8'       // ソースの文字コード(-encoding)
    options.docEncoding = 'UTF-8'    // 出力HTMLの文字コード(-docencoding)
    options.charSet = 'UTF-8'        // HTMLのmeta charset(-charset)
    options.locale = 'ja_JP'
    options.author = true
    options.version = true
    options.addStringOption('Xdoclint:all,-missing', '-quiet')
}
項目 内容
生成コマンド gradle javadoc(Wrapperがあれば ./gradlew javadoc)
HTMLの出力先 build/docs/javadoc
jarの作成 gradle javadocJar → build/libs/stock-javadoc.jar
実際に渡されたオプション build/tmp/javadoc/javadoc.options で確認できる

javadoc.options を見ると、-encoding 'UTF-8'、-docencoding 'UTF-8'、-charset 'UTF-8'、-locale 'ja_JP'、-Xdoclint:all,-missing に加えて、-notimestamp と -quiet、-doctitle 'stock API' が自動で付いていました。

Maven

Mavenでは maven-javadoc-plugin を使います。公式サイトで確認した最新版は 3.12.0 です。今回の環境ではプラグインを取得できなかったため、以下の設定とコマンドは未実行です。

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-javadoc-plugin</artifactId>
      <version>3.12.0</version>
      <configuration>
        <encoding>UTF-8</encoding>
        <docencoding>UTF-8</docencoding>
        <charset>UTF-8</charset>
        <locale>ja_JP</locale>
        <doclint>all,-missing</doclint>
      </configuration>
    </plugin>
  </plugins>
</build>
ゴール 内容
mvn javadoc:javadoc Javadocを生成する
mvn javadoc:jar Javadocをjarにまとめる
mvn javadoc:aggregate 複数モジュールをまとめて1つのJavadocにする
mvn javadoc:test-javadoc テストコードのJavadocを生成する

出力先は target ディレクトリの下です。プラグインのバージョンによって場所が変わるため、実行時のログで確認してください。

EclipseとIntelliJ IDEA

IDEからの生成は今回未実行です。一般に知られた手順を表にまとめます。メニュー名はバージョンによって少し変わることがあります。

IDE 手順 文字コードの指定
Eclipse メニューの「プロジェクト」→「Javadocの生成」→ 対象と出力先を選んで進む 最後の画面の「追加のJavadocオプション」に -encoding UTF-8 -docencoding UTF-8 -charset UTF-8 を入力する
IntelliJ IDEA メニューの「Tools」→「Generate JavaDoc」→ 範囲と出力先を指定する 「Locale」に ja_JP、「Command line arguments」に -encoding UTF-8 -docencoding UTF-8 -charset UTF-8 を入力する

どちらのIDEも内部では javadoc コマンドを呼び出しているので、指定するオプションはコマンドラインと同じです。コメントの入力は、宣言の上で /** と入力してEnterキーを押すと、引数に合わせた @param や @return のひな形が補完されます。

新しい書き方:snippetとMarkdownコメント

サンプルコードを載せるsnippet(Java 18以降)

{@snippet} は、サンプルコードを載せるためのタグです。<pre>{@code ...}</pre> と比べて、< や > をそのまま書け、強調表示やコピーボタンが付きます。

インライン形式(コメントの中に直接書く)は、テンプレートの StockService に入れたとおりです。JDK 21 で生成したHTMLでは、次のように出力されました。

<pre class="snippet"><code>StockService service = new StockService();
service.add("pen", 10);
int left = service.<span class="bold">take</span>("pen", 3);
</code></pre>

// @highlight substring="take" と書いた行のコメントは消え、take が太字になっています。

外部形式では、パッケージのディレクトリに snippet-files というフォルダを作り、その中のファイルから一部を取り込みます。

// src/demo/snippet-files/CalcDemo.java
import demo.Calc;

public class CalcDemo {
    public static void main(String[] args) {
        // @start region="avg"
        double avg = Calc.average(new int[] {80, 90});   // @highlight substring="average"
        System.out.println(avg);
        // @end
    }
}

コメント側は {@snippet file="CalcDemo.java" region="avg"} と書きます。JDK 25 で生成すると、@start から @end の間の2行だけが取り込まれました。サンプルを実際のソースファイルとして持てるので、コンパイルして確かめたコードを仕様書に載せられます。

スニペット内のマークアップ 働き
// @start region="名前" 〜 // @end 取り込む範囲に名前を付ける
// @highlight substring="文字列" その行の指定した文字列を強調する
// @replace substring="A" replacement="B" 表示上、AをBに置き換える
// @link substring="文字列" target="参照先" 文字列をAPIへのリンクにする

スラッシュ3つのMarkdownコメント(Java 23以降)

Java 23 で、/// で始まる行にMarkdownで書けるコメントが加わりました(JEP 467)。JDK 25.0.4.1 の javadoc で次のコードを生成して確認しました。

package demo;

/// 数値の計算をまとめたクラスです。
///
/// 使える操作は次のとおりです。
///
/// - 合計: [#sum(int\[\])]
/// - 平均: [平均を求める][#average(int\[\])]
///
/// | メソッド | 戻り値 |
/// |---------|--------|
/// | `sum` | `int` |
/// | `average` | `double` |
///
/// ```java
/// int total = Calc.sum(new int[] {1, 2, 3});
/// ```
///
/// @since 2.0
public final class Calc {

    private Calc() {
    }

    /// 配列の合計を返します。
    ///
    /// 空の配列を渡すと **0** を返します。
    ///
    /// @param values 合計する値。`null` は指定できません
    /// @return 合計
    /// @throws NullPointerException `values` が `null` の場合
    public static int sum(int[] values) {
        int s = 0;
        for (int v : values) s += v;
        return s;
    }

    /// 配列の平均を返します。
    ///
    /// {@snippet file="CalcDemo.java" region="avg"}
    ///
    /// @param values 平均を求める値
    /// @return 平均。要素が0個のときは [Double#NaN]
    public static double average(int[] values) {
        return values.length == 0 ? Double.NaN : (double) sum(values) / values.length;
    }
}

生成結果では、箇条書きが <ul>、表が <table>、コードブロックが <pre><code class="language-java">、太字が <strong> になり、[#sum(int\[\])] は sum(int[]) へのリンクになりました。

従来の書き方 Markdownコメント
<p> で段落を区切る 空行(/// だけの行)で区切る
{@code null} バッククォートで囲む
{@link #sum(int[])} [#sum(int\[\])]
{@link #sum(int[]) 合計} [合計][#sum(int\[\])]
<ul><li> - 項目
<pre>{@code ...}</pre> バッククォート3つのコードブロック
@param などのブロックタグ そのまま使える

気をつける点が2つあります。

  • 配列の角かっこは \[\] とエスケープする。エスケープせずに [平均を求める][#average(int[])] と書いたところ、error: reference not found になりました。
  • JDK 22以前の javadoc は /// をコメントとして扱いません。同じソースを JDK 21 の javadoc に渡すと、warning: no comment が出て説明は出力されませんでした。チームで使うJDKが23以上にそろってから採用するとよいでしょう。

よく出る警告・エラーと直し方

わざと不備のあるコメントを書いて、JDK 21 の javadoc を実行しました。出力された主なメッセージ(ソースの引用行と一部のメッセージは省略)と直し方です。

bad/demo/Bad.java:7: error: malformed HTML
bad/demo/Bad.java:7: error: element not closed: b
bad/demo/Bad.java:15: error: @param name not found
bad/demo/Bad.java:18: error: exception not thrown: java.io.IOException
bad/demo/Bad.java:19: error: reference not found
bad/demo/Bad.java:21: warning: no @param for value
bad/demo/Bad.java:31: warning: no @return
bad/demo/Bad.java:37: error: invalid use of @return
bad/demo/Bad.java:43: error: unknown tag: String
bad/demo/Bad.java:43: error: semicolon missing
bad/demo/Bad.java:45: warning: @param "a" has already been specified
bad/demo/Bad.java:11: warning: no comment
bad/demo/Bad.java:9: warning: use of default constructor, which does not provide a comment
10 errors
6 warnings
メッセージ 原因 直し方
error: malformed HTML 説明文に < をそのまま書いた(例: 0 < n) {@code 0 < n} または &lt; にする
error: element not closed: b <b> などの閉じタグがない </b> を足す
error: unknown tag: String List<String> の <String> がHTMLタグと解釈された {@code List<String>} にする
error: semicolon missing & のあとが文字参照の形になっていない &amp; にする
error: @param name not found @param の名前が実際の引数名と違う 引数名に合わせる(名前の変更後に起きやすい)
warning: no @param for value 引数の @param がない @param value 説明 を足す
warning: @param "a" has already been specified 同じ引数の @param が2つある 1つにまとめる
warning: no @return 戻り値があるのに @return がない @return 説明 を足す、または {@return 説明} を使う
error: invalid use of @return void のメソッドに @return を書いた @return を消す
error: exception not thrown: java.io.IOException throws に宣言していない検査例外を @throws に書いた メソッドの宣言と合わせる
error: reference not found @see や {@link} の参照先が見つからない クラス名・メソッド名・引数の型を確認する。別パッケージなら完全修飾名で書く
warning: no comment 公開している要素にコメントがない コメントを書く
warning: use of default constructor, which does not provide a comment コンストラクタを書いていないクラスがある コメント付きのコンストラクタを明示する
error: unknown tag: custom.todo 独自タグを -tag で定義していない -tag custom.todo:a:"見出し:" を指定する

検査の強さを調整する

指定 動作(今回の実行結果)
指定なし 上のとおりエラー10件・警告6件。終了コードは1。HTMLは生成された
-Xdoclint:none 検査を止める。同じソースで終了コード0(別形式の警告は表示される)
-Xdoclint:all,-missing 「コメントがない」「タグが足りない」の検査だけを外す
-Werror 警告だけでも error: warnings found and -Werror specified となり終了コード1

おすすめの進め方は、最初は -Xdoclint:all,-missing で書式の誤りだけを直し、コメントがそろってきたら -missing を外す流れです。CIで品質を保ちたいときは -Werror を加えます。

独自タグを定義する

@custom.todo のような独自のブロックタグは、-tag 名前:場所:見出し で定義します。場所の a は「すべての場所」の意味です。-tag custom.todo:a:"Todo:" を指定して生成すると、「Todo:」の見出しの下にタグの内容が出力されました。見出しを日本語にする場合、今回の環境ではコマンドラインに直接書くと見出しが正しく表示されず、UTF-8で保存したオプションファイル(@opts.txt)に書くと正しく出力されました。

読みやすいJavadocを書くコツ

コツ 例
要約は1文で、何をするかを書く 「在庫を取り出し、残りの数を返します。」
メソッド名の言い換えで終わらせない getCount に「件数を取得します」だけでなく、「登録がない場合は0」のような条件を添える
引数は範囲と null の可否を書く 「1以上1000以下」「null は指定できません」
例外は発生する条件を書く 「在庫が足りない場合」
コードに出てくる語は {@code} で囲む {@code null}、{@code true}
実装の細かい手順ではなく、使う人に必要な約束を書く 戻り値の意味、前提条件、副作用
非推奨にするときは代わりの手段を示す @deprecated {@link #count(String)} を使ってください。

よくある質問

Q. @paramや@returnは必ず書く必要がありますか? A. 文法上は省略しても生成できますが、既定の検査(doclint)では warning: no @param for value や warning: no @return が表示されます。公開するAPIでは書いておくと、使う人が引数の範囲や戻り値の意味をすぐ確認できます。短いメソッドなら {@return 説明} を使うと、要約と戻り値の説明を1回で書けます。

Q. privateなメソッドにもJavadocを書くべきですか? A. 既定の設定ではprivateな要素はHTMLに出力されませんが、/** */ の形で書いておくと、IDEでメソッド名にカーソルを合わせたときに説明が表示されます。処理の意図が伝わりにくい箇所には書いておくと、読む人の助けになります。HTMLにも出したいときは -private を付けます。

Q. @throwsと@exceptionはどちらを使えばよいですか? A. 意味は同じです。仕様書では @exception は @throws と同等の別名とされています。メソッド宣言の throws と同じ語になる @throws にそろえると読みやすくなります。

Q. 生成したHTMLの見出しを日本語にできますか? A. -locale ja_JP を付けると、「パラメータ:」「戻り値:」「例外:」などの日本語の見出しになります。Gradleでは options.locale = 'ja_JP' で指定できます。

まとめ

  • Javadocは、専用のコメントからHTMLの仕様書を作る仕組み。コメントは /** で始め、1文目が要約、続けて説明、最後にブロックタグを書く
  • よく使うタグは @param・@return・@throws・@see・@since・@deprecated と、文中の {@code}・{@link}
  • recordの構成要素はクラスのコメントの @param で説明する
  • 生成は javadoc -d docs -sourcepath src -encoding UTF-8 -docencoding UTF-8 -charset UTF-8 パッケージ名。@author と @version は -author -version を付けたときだけ出力される
  • 文字化けやエラーは -encoding(ソース)・-docencoding(出力)・-charset(meta) の3つをそろえて防ぐ
  • {@snippet}(Java 18以降)とMarkdownコメント ///(Java 23以降) で、サンプルコードや表を書きやすくなった
  • 警告やエラーはメッセージと行番号から原因を特定し、-Xdoclint で検査の強さを調整する

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Javadocの書き方|タグ一覧(@param,@return)と生成コマンド」

株式会社RJCでは、Javadocをはじめとするドキュメントの書き方を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?