Javaのエラーを直して覚える
javacが実際に出力するメッセージを読みながら、空欄を埋めてビルドを通します。全188問。間違えた問題は翌日・3日後・7日後に自動で再出題されます。
エラー別に調べる
初級
- ';' expected の原因と直し方セミコロンの付け忘れで出る最頻出エラー。javacがどこで文の終わりを探しているかを読めば、行番号が実際の原因とずれる理由も分かります。
- reached end of file while parsing の原因と直し方波括弧の対応が崩れたときに出ます。エラー行がファイル末尾を指すため、原因箇所の特定にコツが要ります。
- incompatible types の原因と直し方型が合わない代入で出ます。String / int / char / double の相互変換ルールを整理します。
- cannot find symbol (variable) の原因と直し方変数名のタイプミス、宣言忘れ、スコープ外参照の3パターンに分けて原因を切り分けます。
- cannot find symbol (method) の原因と直し方println、length、toUpperCase など、綴りと大文字小文字を間違えやすいメソッド名を集めました。
- Main method not found in class の原因と直し方コンパイルは通るのに実行できない典型。JVMがmainを見つける条件を1つずつ確認します。
- 配列の new と初期化子の書き分けnew int[3] と {1,2,3} の使い分け。角括弧と波括弧の役割の違いを整理します。
- variable might not have been initialized の原因と直し方ローカル変数は自動で初期化されません。javacがどの経路を「値が入らない道」と判定するかを解説します。
- missing return statement の原因と直し方すべての経路で値を返す必要があります。ifだけで分岐したときに漏れる道を可視化します。
- char と String のクォートの違いシングルクォートとダブルクォートは互換性がありません。エスケープの書き方も合わせて扱います。
- Javaの大文字小文字ルール予約語は小文字、クラス名は大文字始まり。この規則を破ったときに出るエラーを網羅します。
- if文の括弧と比較演算子= と == の取り違え、&& と and の混同など、条件式まわりの定番ミスを扱います。
- variable is already defined の原因と直し方同じスコープでの再宣言。値の変更と宣言の違いを、引数とループ変数の例で確認します。
- integer number too large の原因と直し方数値リテラルは既定でint型です。longリテラルのLと、intオーバーフローの挙動を扱います。
- Scanner が使えないときの確認手順importの必要性、System.inの渡し方、nextIntとnextLineの型の違いを順に確認します。
- unexpected return value の原因と直し方voidメソッドは値を返せません。戻り値型の宣言と実際のreturnを一致させる考え方を整理します。
- 文字列連結の + とカンマの違い+ は連結、カンマは引数の区切り。左から評価される性質による計算結果のずれも扱います。
中級
- == と .equals() の違い(文字列比較)Java初学者が最も多く踏む罠。参照比較と値比較の違い、定数プール、null安全な書き方まで扱います。
- NullPointerException の原因と直し方nullに対する操作で発生します。発生箇所の特定方法と、そもそもnullを持ち回さない設計を扱います。
- ArrayIndexOutOfBoundsException の原因と直し方添字が0始まりであることの帰結です。ループ条件の < と <= の使い分けを整理します。
- 整数同士の割り算で小数が消える理由int / int はintで計算されます。キャストの位置による結果の違いを扱います。
- ArithmeticException: / by zero の原因と直し方int型同士の割り算・剰余算で分母が0だと例外になります。doubleとの挙動の違いと、事前チェックの書き方を扱います。
- NumberFormatException の原因と直し方parseIntは全体が数値でなければ失敗します。空白や記号が混ざる入力の扱い方を解説します。
- non-static variable cannot be referenced の原因と直し方staticとインスタンスの境界。mainから他のメンバーを呼ぶときの3つの選択肢を比較します。
- nextInt の後の nextLine が読み飛ばされる理由改行文字の読み残しが原因です。判定と読み取りの単位を揃える設計を扱います。
- char の演算と文字コードcharは演算するとintに昇格します。'0'を引く定番テクニックの仕組みも解説します。
- 0.1 + 0.2 が 0.3 にならない理由2進小数の限界です。誤差を許容する比較と、金額計算でBigDecimalを使う理由を扱います。
- Stringが不変であることの実害メソッドは新しい文字列を返すだけです。戻り値を捨てるミスと、StringBuilderの使いどころを扱います。
- ループが終わらない・空回りする原因カウンタ更新の忘れ、更新方向の誤り、forの直後のセミコロンという3パターンを扱います。
- switch で break を忘れるとどうなるか次のcaseへ落ちるフォールスルーの挙動と、defaultの役割、String switchの書き方を扱います。
- length / length() / size() の使い分け配列はフィールド、Stringはメソッド、コレクションはsize()。3種類を対比で覚えます。
- ClassCastException の原因と直し方キャストは宣言にすぎず、実体が違えば実行時に落ちます。instanceofによる事前確認を扱います。
- ConcurrentModificationException の原因と直し方ループ中のリスト変更で発生します。removeIf、Iterator、逆順ループの3つの解法を比較します。
- 値が変わらないときに疑う変数の隠蔽同名のローカル変数がフィールドを覆い隠します。コンストラクタでthis.が必要な理由を扱います。
- i++ と ++i の違い評価される値のタイミングが違います。i = i++ が何も変えない理由も解説します。
上級
- unreported exception must be caught の原因と直し方検査例外と非検査例外の境界。throwとthrowsの違い、catchできない型の条件を扱います。
- Map と HashMap を両方importする理由インターフェースと実装クラスは別物です。受け口を広く、実体を具体的にという原則を扱います。
- raw type とワイルドカードの使い分け型引数を省くと型安全が失われます。List<Object>とList<?>の違いも整理します。
- @Override が通らないときの確認手順名前・引数・可視性の3点が一致条件です。オーバーロードとの違いを実例で確認します。
- equals と hashCode を必ずセットで実装する理由HashSetやHashMapが先にハッシュ値で振り分けるためです。引数をObjectにする理由も扱います。
- is not abstract and does not override の原因と直し方抽象メソッドの実装漏れ。extendsとimplementsの使い分け、可視性の制約も扱います。
- cannot assign a value to final variable の原因と直し方finalが固定するのは参照であって中身ではありません。final / static final の違いを整理します。
- コンストラクタとメソッドの見分け方戻り値型を書くとただのメソッドになります。既定コンストラクタが消える条件も扱います。
- super() と this() の呼び出しルール必ず先頭に置く必要があります。親に引数なしコンストラクタがない場合の対処を扱います。
- finally の return が結果を上書きする問題finallyでreturnを書いてはいけない理由と、try-with-resourcesによる安全なリソース解放を扱います。
- オートボクシングで起きる NullPointerExceptionIntegerはnullを持てますが、演算時にintへ開封されます。Map.getの戻り値の受け方を扱います。
- Integer の == が 127 までしか動かない理由-128〜127のキャッシュが原因です。たまたま動く挙動に依存する危険性を扱います。
- static フィールドの初期化順序宣言順に初期化されます。static初期化ブロックとインスタンス初期化ブロックの違いも扱います。
- 可変長引数の制約とオーバーロード優先順位最後の引数にしか置けません。通常のオーバーロードが優先される順序も解説します。
- local variables must be final or effectively final の原因と直し方ラムダが参照するローカル変数は再代入できません。配列で回避する定石も扱います。
- stream has already been operated upon の原因と直し方Streamは1回しか終端操作できません。中間操作の遅延評価も合わせて解説します。
- default メソッドの衝突と解決複数のインターフェースから同名を継承すると衝突します。A.super.name() による明示的な選択を扱います。