はじめに
新しい機能のクラスを足したら、コンパイルエラーが大量発生。しかも触っていないファイルまで赤くなる始末で、盛大にこんがらがりました😅
原因はコードそのものではなく、ファイルの置き場所でした。新規クラスの作り方でつまずいた記録です。
環境
- Java 21
- Spring Boot 3.5.14
- エディタ:VS Code 系(Java 拡張)
起きたこと
新しいクラス(例:CommentController)を追加してビルドすると、エラーが大量に:
エラー: シンボルを見つけられません
シンボル: クラス CommentRepository
...
エラー: クラス CommentController はpublicであり、ファイル CommentController.java で宣言する必要があります
おかしいのは、さっきまで動いていた別のファイルまで赤くなっていること。コードは合っているはずなのに……。
最初は import ミスか package 名のズレを疑って、関係ないファイルを何度も見直していました。でも犯人は別のところにいました。
原因
やってしまっていたのは2つ:
-
新しいクラスのコードを、既存ファイルに貼ってしまった
CommentControllerのコードを、間違えてUserController.javaに貼り付け →UserController.javaの中にpublic class CommentControllerが居る状態に。
Java は 1ファイル=1つの public クラス(ファイル名=クラス名) がルール。だから「CommentController は CommentController.java で宣言して」と怒られ、ついでに元のUserControllerまで壊れる。 -
既存ファイルを消してしまっていた(
CommentRepository.javaが無い)
「赤くなっている場所」と「本当の原因」がズレるので、エラーメッセージだけ見ると迷子になります。
解決
順番に切り分けました。
① まず git status で状況を見る
M UserController.java ← 中身が変わっている(壊れた)
D CommentRepository.java ← 消えている
?? CommentController.java ← 新規
M(変更)・D(削除)・??(新規) で「何が起きたか」が一目で分かります。
(パスは見やすく短くしています。実際は src/main/java/.../UserController.java のようにフルパスで出ます)
② 壊した既存ファイルは git restore で元に戻す
git restore UserController.java
最後にコミットした状態に戻ります。ただし git restore はそのファイルの未コミットの変更も消します。残したい変更がある場合は、先にコミットや git stash で退避してから実行してください。
③ 新規クラスは新しいファイルに(今回はターミナルで)
VS Code のエクスプローラーで新規ファイルを作って貼ってもよいのですが、私は「どのファイルに貼ったか」を間違えたので、今回は貼り間違いを避けるためにターミナルで作りました。heredoc ならファイル名と中身が必ず一致します。
cat > CommentController.java <<'EOF'
package com.example.demo;
public class CommentController {
// ... 中身 ...
}
EOF
cat > ファイル名 <<'EOF' … 次の EOF までを、そのファイルの中身にする、という意味です。
補足:赤線とビルド、どちらを信じる?
エディタの赤線は、本物のエラーのことも、言語サーバーの索引が追いつかないだけの"幻"のこともあります。どちらかは ビルドで確かめるのが確実です(./gradlew compileJava など)。
- ビルドが失敗したら、赤線(の少なくとも一部)は本物 → 直す
- ビルドが通ったのに赤線が残るなら、言語サーバーの索引が古い可能性があります → VS Code の再読み込みや Java Language Server の再起動で消えることがあります
実際この時も、本物の赤線(ファイルの貼り間違い)と、幻の赤線(触っていないファイル)の両方が出ていました。
学び
- 1ファイル=1つの public クラス(ファイル名=クラス名)。別クラスを既存ファイルに貼らない。
- 新規クラスは新しいファイルを作って書く(貼り間違いが不安ならターミナルが確実)。
- エラーが大量でも、
git statusとビルド結果で根本原因を見る。赤線は本物のことも幻のこともあるので、ビルドで確かめる(赤線の場所=原因とは限らない)。
おわりに
コードのバグより、ファイルの置き場所でこんがらがる方が、初心者あるあるかもしれません😅
同じ「シンボルが見つかりませんの嵐」で固まった人の参考になれば嬉しいです🙌