Because We Love Happy Coding

フリーライターがPHPとかJavaとか勉強してます

Java初学者がひっかかっていたところまとめ

1ヶ月ほど初学者に教えた際、ひっかかっていたところをまとめた。何かの参考に。

Eclipseエディタのエラー表記が消えない

セーブしていない

基本。Eclipseのエラー表記は、保存されるタイミングで更新されるので、記述を直しても保存しないとマークが出たままになる。

何かのキャッシュが残ってしまっている

Eclipseでたまにある。ファイルを閉じて開くとエラーが消える。

「変数〜は一度も使われていません」

Eclipseの愛情を感じるエラーというかアラート。初心者向けのソースでは使わない変数でもお作法っぽい理由で変数作っていたりするので、けっこうこれが出てくる。

未完成ソースコード

未完成のソースコードで「エラーやアラートが消えません」と言ってくる事例。そりゃ未完成だからね。書き進めると消える種類のもの。

「〜を変数に解決できません」

以下のケースが多い。

変数の宣言をしていない

基本。

宣言とスコープの問題

これが割と多い。 「宣言した変数はブロック内で有効」ということがまだ飲み込めずエラーになっている。 あるいは逆に上位のブロックで宣言したために、破棄されるべきデータが破棄されず残ってしまい、想定外の挙動をする。

書き間違い

メソッド名に()を付け忘れるなどで変数名と見なされてしまい「〜を変数に解決できません」になる。

「型名を解決できません」

自分で作成したクラスの場合は打ち間違い。

(自分で作成していない)クラス名が与えられている場合は、import忘れが多い。

文字化け

いくつかのパターンがある

文字コード指定がおかしい

文字コードの誤字

「uft8」とかその類型。

req側の指定とres側の指定両方が必要

サーブレットの場合、RequestとResponse両方に文字コード指定が必要。

オブジェクトを直接System.out.printしようとしている

データを保持するEntityオブジェクトをそのまま表示しようとして文字化けする。

JDBC

duplicate PRIMARY KEY

jdbcSQLのINSERT文を実行する際に、「既に存在する主キー」を追加しようとすること。IDの重複など。
例文の通りにINSERT文を打ち込んで、2回(以上)実行しようとするとこれが出る。

引数間違いによるSQLException

サーバー名などの打ち間違いが多い。「locahost」などサラッと書いてあると意外と見つけづらい。

INパラメータ指定

PreparedStatementのINパラメータを指定する際に順番を間違えている。

suitable driver not found

DriverManager.getConnection(url,user,password)で「suitable driver not found」と出る。

getConnection()の第一引数のurlを打ち間違えている

jdbc:」と書くべきところを「jbdc:」と打ち間違えたりすると、「driver not found」になる。

環境設定ミス。クラスパスが何かの原因で通っていない。

これはしんどい。なかなか気づかない。

JSPサーブレット

「formのname属性」「key」「変数名」の混乱

往々にしてベテランは後で見て追いやすいように(サンプルコードも)同じkey名を使い回す傾向がある。慣れた人は文脈を見れば「これが変数名」「これが属性名」などすぐわかるのだけれど、初学者にはどれがどれに対応しているのかわかりづらい。

サンプルコードでユーザーなどの「名前」をデータとして持つ場合が最悪でこんな感じになる。

  • HTML/JSPファイル: formタグのname属性に氏名を入力させ"name"のキーを持たせる
  • httpリクエスト: 格納されているkeyが"name"で値が"山田"
  • サーブレット: request.getParameter(“name”)で取り出した値を入れる変数名がname

name の name が nameである、みたいなことになり、ここを丁寧に説明しないとしんどい。

404エラー

JavaリソースとHTML/JSPのパスの違い。 Javaリソースはアノテーション(またはweb.xml)でパスを指定するため、プロジェクト名の直下がほとんど。HTMLやJSPなどはディレクトリ階層を正しく指定する必要がある。

getParameterとgetAttributeの違い

formから受け取る時は getParameter() 。
setAttribute() したものを受け取るときは getAttribute() 。
getAttribute() のキャスト忘れ/キャストミスもある。

EL式/Beansの形式

${sessionScope.beans.member} のようにドット記法でつなぐのを忘れて、 ${sessionScope.beans} または ${sessionScope.member} のように書いてしまうことが多い。