0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

新規クラスを作ったら「シンボルが見つかりません」の嵐。犯人はファイルの置き場所でした

0
Posted at

はじめに

新しい機能のクラスを足したら、コンパイルエラーが大量発生。しかも触っていないファイルまで赤くなる始末で、盛大にこんがらがりました😅
原因はコードそのものではなく、ファイルの置き場所でした。新規クラスの作り方でつまずいた記録です。

環境

  • Java 21
  • Spring Boot 3.5.14
  • エディタ:VS Code 系(Java 拡張)

起きたこと

新しいクラス(例:CommentController)を追加してビルドすると、エラーが大量に:

エラー: シンボルを見つけられません
    シンボル: クラス CommentRepository
...
エラー: クラス CommentController はpublicであり、ファイル CommentController.java で宣言する必要があります

おかしいのは、さっきまで動いていた別のファイルまで赤くなっていること。コードは合っているはずなのに……。
最初は import ミスか package 名のズレを疑って、関係ないファイルを何度も見直していました。でも犯人は別のところにいました。

原因

やってしまっていたのは2つ:

  1. 新しいクラスのコードを、既存ファイルに貼ってしまった
    CommentController のコードを、間違えて UserController.java に貼り付け → UserController.java の中に public class CommentController が居る状態に。
    Java は 1ファイル=1つの public クラス(ファイル名=クラス名) がルール。だから「CommentController は CommentController.java で宣言して」と怒られ、ついでに元の UserController まで壊れる。
  2. 既存ファイルを消してしまっていた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 とビルド結果で根本原因を見る。赤線は本物のことも幻のこともあるので、ビルドで確かめる(赤線の場所=原因とは限らない)。

おわりに

コードのバグより、ファイルの置き場所でこんがらがる方が、初心者あるあるかもしれません😅
同じ「シンボルが見つかりませんの嵐」で固まった人の参考になれば嬉しいです🙌

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?