スッキリわかるJava入門

エラーで困った時こそ、役に立ちたい。

いつも拙著『スッキリわかるJava入門』に、あたたかい書評を戴き本当にありがとうございます。お蔭様で予想より早く増刷が決まり、4月上旬あたりから第2刷が書店に並びはじめるようです1

3月上旬はその増刷のための準備作業を行っていたのですが、執筆終盤のことを懐かしく思い出しました。

遡ること2011年の秋。このまま本を書き進めたら「800ページの極厚入門書」になることに気付いた著者・編集者が、完成間近な章を次々バッサリ殺るという市ヶ谷スッキリの変が勃発。執筆終盤にも関わらず、章や図の番号は全部振り直しになるわ、せっかく描いていただいたイラストは水泡に帰すわ、「それって新16章?それとも旧16章のこと?」みたいなメールが飛び交うわと、制作現場を恐怖のどん底に突き落としました。

しかし、容赦なくそして次々と章や図版を斬り落としながらも、著者・編集者ともに「絶対に収録する」と心に決めていたのが付録B『エラー解決・虎の巻』。今回は主犯である著者自ら、付録とそれに秘められたエピソードをご紹介致します。

 

付録B: 「エラー解決・虎の巻」

Javaを学ぶ過程では、誰しもエラーに悩まされます。思ったように動かないが、なぜ動かないのかわからず、あーでもないこーでもないと数時間~数日の時間を棒に振ることも珍しくありません2

そこで、はじめてJavaを学ぶ方々がエラーにぶち当たった際に「とりあえずこの付録を見ればなんとかなるかも」と思えるよりどころを作りたくて準備したのがこの付録Bです。

付録は次の3つの内容から構成されています。

  • B.1 エラーとの上手なつきあい方
  • B.2 トラブルシューティング
  • B.3 エラーメッセージ別索引

それぞれについて軽くご紹介しましょう。

 

大前提となる「エラーの読み方」「エラーとのつきあい方」を紹介

  • 入門書いはく、「エラーメッセージはちゃんと読みましょう」
  • 先輩いはく、「質問する前にエラー読め。答えはそこに書いてある」

でも実は、初学者の多くが、そもそも「エラーの読み方」をちゃんと知らない(学んでいない)のです。

例えば、大量の英語メッセージが表示されるJavaのスタックトレース。

Exception in thread "main" java.lang.NumberFormatException: null
 at java.lang.Integer.parseInt(Unknown Source)
 at java.lang.Integer.parseInt(Unknown Source)
 <span style="color:red">at Sub.process(Sub.java:3)</span>
 at Main.caller(Main.java:28)
 at Main.main(Main.java:6)

7行もありますが、経験者は瞬時に赤字の部分に注目し、Sub.javaの3行目あたりがクサいと特定できます。

しかし、その判断に至るための「スタックトレースの読み方の手順」をきちんと伝えている先輩、教材は意外と少ないのではないでしょうか。

初心者にしてみれば、プログラム動かした直後にこんなもん表示されたら、「ヒステリー気味の外国人に、なんか猛烈な勢いで怒鳴られた」としか感じません。恐怖におののき、先輩に「動きません」「エラーがでます」と助けを求めると、今度は「エラーちゃんと嫁ごるぁ(#゚Д゚)」という怒鳴り声が飛んできます。あはれ、JVMと先輩からライダーダブルキックを食らい血だらけになる初心者。

ですから、付録B.1ではコンパイルエラーやスタックトレースの読み方を丁寧に掲載しました。学び手の方々に「この手順で機械的にエラーメッセージを読んでいけば、問題の原因に辿り着く有力なヒントが必ず得られる」という方法を理解していただくためです。

一度エラーの読み方を理解し、そのとおりに実践し、エラーを解決できればしめたもの。
まず「スタックトレースとは実は怖い外国人なんかではなく、実はヒントをくれるイイヤツなんだ3」と思えるようになります。そしてすぐに「スタックトレースが出ても、いつものやり方で機械的に読んでいけば原因を特定して確実になおせる」という自信に変わります。

 

Javaでの「あるあるハマりパターン」TOP33を集めました

Javaに限らず、なんでプログラミング言語のエラーメッセージというのはこうもサディスティックかなぁと思います。4開発者、特に初学者の方は「エラーを見ても意味がわからない」「コードを見直してもどこが間違っているのかわからない」という状態に何時間もハマって悩んでしまうことも珍しくありません。

そこで付録B.2「トラブルシューティング」では、毎年かなりの人数のJava初心者が悩む姿をLiveで見て「初心者がよくハマる落とし穴」の知識にだけは自信がある著者が「Javaあるあるハマりパターン」33個を厳選し、その傾向と対策を紹介しています。

それぞれのエラーについては、以下の4つを掲載していますので、「エラーが出たけどどうしてもわからん!」というときに、駆け込み寺的に参照して貰えれば幸いです。

  • 症状:どんなエラーの症状が起きるか?
  • 原因:なぜそのエラーが起きているのか?
  • 対応:どのように対応すればよいのか
  • 参照:『スッキリわかるJava入門』本編のどこで解説しているか

内容としては、非常に基礎的なものから高度なものまで集めました。いくつかご紹介しましょう。

 

B.3.3「javac Main」と入力して失敗する

Java学習開始から24時間以内に誰もがハマる、まさにKing of あるあるハマりパターン。「javaコマンドとjavacコマンド」、「拡張子をつけるか外すか」を取り違えるというものです。

間違いの原因は非常に単純なのですが、タチが悪いのはいざ間違った場合に表示されるエラーメッセージ。

その意味不明さおぼっちゃまクン級。思わせぶりさ不二子級。

 

B.3.8『¥12288は不正な文字です。』

ソースコード中に全角スペース(文字コードのエスケープ表記が¥12288)が混入している場合に表示されるエラーメッセージです。

画面上では半角空白などと区別が付きづらいため初心者が独力で原因に気付くことが難しく、「はぁ?1万2千円?」と頭をかしげながら財布を開く不幸に見舞われます。

また、大学時代のレポート課題で「コピペKing」「コピペQueen」の名誉を欲しいままにした方の場合、「全角スペースが混じったサイトからソースを拝借して自爆」のパターンがあることも併せて注意喚起させていただきました。

 

B.4.5『メソッド呼び出しの戻り値をDate型変数に代入できない』

自分ではjava.util.Dateをimportしたつもりなのに、意図せずjava.sql.Dateをimportしてしまっているというトラップです。
ツールになれていない段階の初心者がeclipseを利用して日付型(java.util.Date)を用いる際、

  1. 入力支援機能がアルファベット順で前にあたる「java.sql.Date」を補完候補として優先提示
  2. 無意識にEnterキーでjava.sql.Dateを選択
  3. ソースコード先頭部の複数のimport文は折りたたまれて表示され、java.sql.Dateをimportしてしまっていることが見えない

という魔の3段トラップにより、「おっかしぃなぁ....あってるよなぁ...」と3時間ぐらいソースコードを眺めるハメになることがあります。同様のトラップとして、「java.util.Listのつもりがjava.awt.List」というパターンも紹介しました。

なお、いざエラーに直面した際に全33パターンを頭から調べるのは大変でしょうから、エラーメッセージから簡単に逆引きできるための索引もB.3として掲載しました。

きっかけは、逆ギレでした。

そんな付録Bこそ「入門書にとって絶対必要なもの」だと私が信じてやまないのには、教え子とのある想い出があるからです。

限られた期間でプログラムを作らなければならない開発演習課題で、丸1日ハマって頭を悩ませ続けていた彼が疲れた笑顔でボソっとひとこと。

肝心な時に、テキストや入門書って役に立ちませんよね。

確かに「正しい書き方」のことは丁寧に書かれていますが、
もし「間違った書き方」をしてしまったらどうしたらいいか、
自分が「どこをどう間違ってしまっているのか」ほとんど教えてくれません。

初心者だからこそ、よく間違えるはず。なのに、間違ったら誰も助けてくれない。

まぁ「もうちょっと悩め」と放置していた私としては軽く逆ギレされたわけですが、妙に納得してしまいました。

確かに上級者より初心者の方がよく間違えるし、自分が間違えた理由がわからなくて当然です。
ならば、初心者が使う入門書こそ、「間違えたときのこと」を手厚くサポートするべきではないでしょうか。

そんな彼との想い出が私に作らせたものこそ、付録B『エラー解決・虎の巻』なのです。

もっと「まちがえよう」

学び手の方をサポートする方法には、大きく分けて2つのアプローチがあると思います。

  1. 「正しい道(正常系)の歩き方」をしっかり伝え、間違えないようにすること
  2. 「間違えた場合(異常系)の対処法」を伝え、もし間違えても復帰できるようにすること

それらのバランスは場合によりけりだと思いますが、特に危険が伴うスポーツなどでは後者が重要視されます。例えば、スノーボードなど冬山スポーツをなさる方は、「滑り方」以前に「倒れ方と起き上がり方」を習ったはずです。

そして「転んだ数だけ上手くなる」というスノーボード同様((その他、「飲んだ数だけ強くなる」酔拳、「涙の数だけ強くなれる」岡本真夜など))、「間違えた数だけ成長する」のがプログラミング。いろんな試行錯誤をして、何度も「間違えて→悩んで→気付いて→解決して→納得する」ことを経てはじめて、深い理解と広い応用力に繋がるのではないでしょうか。

「一度間違えたら、誰も助けてくれない。なかなか正しい道に復帰できない」と、もう怖がらないでください。

虎の巻がついている以上、どんどん間違えなきゃ損ってもんです。

 

今回のまとめ

「タケルくん! 間違える勇気をあげるっ!」

 

参考

このブログ記事は、著者の個人ブログ(flairDays)から移転掲載されたものです。

  1. 初版は姿を消し始めますので、初版コレクターの方は今のうちに最寄りの書店へ!!
  2. パソコンの電源が入らないと散々騒いだ挙げ句、コンセント抜けてました的な恥をいくつもさらして成長するのがプログラマってもんです
  3. 「われぇ、よぉぅきたなぁ~」とドスのきいた低い声で歓迎してくれるミナミのおじさまや、「あっ、あんたなんかに、8行目あたりがエラーの原因だなんて絶対教えてやらないんだからっ・・・!(頬染)」というツンデレみたいに思えてくればきみも上級者の仲間入りだ
  4. でも最近は慣れてしまって「&lt;identifier&gt;がありません。」のような、思わず「はぁ?(#゚Д゚)」と言いたくなるDQNエラーメッセージを見ても「はいはい。」とコードを直してしまう自分に気付き、俺もずいぶんスレちまったなとうそぶいたりもするわけですが。

-スッキリわかるJava入門
-