詳細はこちら

プログラムにはバグがつきものです。バグとはプログラムの誤りのことであり、そのバグを取り除かないとプログラムは望んだ動作をしてくれません。バグ取り作業のことをデバッグといいます。
人間が目でバグを探すのは大変なので、その作業を支援してくれるのがコンパイラ(javac)です。javacはプログラムにエラーを発見すると、その結果を表示してくれます。この表示のことをエラーメッセージと呼びます。
エラーメッセージを見るとわかるのですが、実はエラーメッセージを読むのには慣れが必要です。日本語なのですが(場合によっては英語)、ある程度、知識と経験がないとその意味を理解することが難しいのです。初心者の皆さんがまず知っておくべきエラーメッセージの読み方(姿勢)を以下に列挙します。1年後にはスラスラ読めるようになるでしょう。途中で諦めなければという条件付きですが。
(1)エラーメッセージをまず1つ読む
ちょっと間違えただけでエラーメッセージが山のように表示されることがあります。初心者の方は、それだけでやる気をなくしてしまうでしょう。そんなとき、エラーメッセージの最初もしくは最後の1行だけを読みましょう。あとは無視!その行について以下の(2)と(3)を行います。それだけです。で、ここから重要です。1文字直しただけで、それまで山のように表示されていたエラーメッセージが奇麗さっぱり無くなるのは快感です。テトリスのまとめ消しやぷよぷよの連鎖に似ています。ぜひ、その快感を体験してみてください
(2)エラー箇所(行)を見る
例えば、エラーメッセージが下記のように表示されていたとしましょう。そこでまずみなさんがやるのはプログラムのどこにエラーがあるか知ることです。で、javacは大変偉い先生?なので、エラーがあると思われる怪しい場所を教えてくれます。その場所が以下のエラーメッセージに隠されている(隠していないですがw)のです。下記のメッセージの場合、赤字で書かれている数字6がヒントで、これは「プログラムの先頭から6行目にバグがありそうだから調べてご覧なさい」とjavacが教えてくれているのです。ただし、ちょっと難しいのですが、この「6行目」というのは目安に過ぎないということです。6行目にエラーがあるかもしれないけど。。。その前にあるエラーがドミノ倒しのようにつもり重なってjavacが「6行目にエラーがある」と勘違いする場合があるのです。この意味は今後の演習で少しずつ経験を積んでいくとわかりますので、とりあえずそんなところで。
Ex2_7.java:6: ‘class’ または ‘interface’ がありません。
(3)メッセージを(見るのではなく)読む
で、本題。メッセージの文章を読みます。ちょっと見て「ワカンネー」と反応するのではなく、とりあえず読んでみて、そのキーワードを手がかりとして、プログラムに潜むバグを捜索するのです。もう一度、以下のメッセージに登場してもらいましょう。メッセージ文は赤字の部分です。javacは、classまたはinterfaceがない、と言っているようです。”interface”は見たことがないでしょう。プログラムに入力した覚えもないでしょう。interfaceはJAVAの授業でも後半にならないと出てこない単語なので、ここでは無視することにします。英文を読むときに知らない単語はとりあえず読み飛ばして、知っている単語の意味をつないで文章全体の意味を想像する。。。それと同じです。次は”class”ですね。classはJAVAでプログラムを書くときには必ず入力しなければならない単語です。ということは、何やら怪しいですね。。。確かにclassと入力したはずなのに、classがないってぇ? とここまでメッセージを読めれば大成功です。この段階では、エラーメッセージ中のキーワードを読んで、javacが言わんとしていること推理する。これを最初の段階でちゃんとやるかやらないかでプログラミングの実力は雲泥の差になります。
Ex2_7.java:6: ‘class’ または ‘interface’ がありません。
(4)あとは経験
ちょっと無責任ですが。。。大切なのは上記の(1)〜(3)をしっかりやることです。この基本に則って、いくつもプログラムを入力しては間違いをする、という流れを繰り返し経験します。エラーメッセージからエラー箇所を特定する作業は最初は難しいです。でも、慣れてくれば、エラーメッセージを見ただけでエラー箇所や内容を瞬時に想像できるようになります。とりあえず、経験する前に、以下で代表的なエラーメッセージを見てみましょう。正常なプログラムをわざと壊してjavacがどういうエラーメッセージを表示するか見ます。逆説的なアプローチですが、javacのソースを読まなくても入力と出力からjavacの仕様が理解できますので有効な手法だと私は思っています。ちなみに私はC++を学習するときにこのような手法を使いました。
以下、プログラムとエラーメッセージを対応づけて表記します。まず、プログラムを表し、その後に→にエラーメッセージを表します。
■実験のもととなる正常なプログラム
class Ex2_1
{
public static void main(String [] args) {
System.out.println(“Hello!”);
}
}
→エラーなし()
■classのsを削除してみた
clas Ex2_2
{
public static void main(String [] args) {
System.out.println(“Hello!”);
}
}
→Ex2_2.java:1: ‘class’ または ‘interface’ がありません。
clas Ex2_2
^
■publicのiを削除してみた
class Ex2_3
{
publc static void main(String [] args) {
System.out.println(“Hello!”);
}
}
→Ex2_3.java:3: <identifier> がありません。
publc static void main(String [] args) {
^
Ex2_3.java:6: ‘;’ がありません。
}
^
■staticのcを削除してみた
class Ex2_4
{
public stati void main(String [] args) {
System.out.println(“Hello!”);
}
}
→Ex2_4.java:3: <identifier> がありません。
public stati void main(String [] args) {
^
Ex2_4.java:6: ‘;’ がありません。
}
^
■voidを削除してみた
class Ex2_5
{
public static main(String [] args) {
System.out.println(“Hello!”);
}
}
→Ex2_5.java:3: メソッドの宣言が不正です。戻り値の型が必要です。
public static main(String [] args) {
^
■String [] args の [] を削除してみた
class Ex2_6
{
public static void main(String args) {
System.out.println(“Hello!”);
}
}
→ぬわんと!エラーなし。引数を使わない場合はいいが。。。恐らく引数が2つ以上になると危険ですな。javacがエラーを検出できない理由はもし興味があれば自分で調べてみるか先生に質問してみてください。
■main() のすぐあとの { を削除してみた
class Ex2_7
{
public static void main(String [] args)
System.out.println(“Hello!”);
}
}
→Ex2_7.java:3: ‘;’ がありません。
public static void main(String [] args)
^
Ex2_7.java:6: ‘class’ または ‘interface’ がありません。
}
^
Ex2_7.java:7: ‘class’ または ‘interface’ がありません。
■printlnをpritnlnにしてみた(良くやるタイプミス)
class Ex2_8
{
public static void main(String [] args) {
System.out.pritnln(“Hello!”);
}
}
→Ex2_8.java:4: シンボルを見つけられません。 System.out.pritnf(“Hello!”);
^
■Hello!の直後の ” (ダブルクオーテーション)を削除してみた
class Ex2_9
{
public static void main(String [] args) {
System.out.println(“Hello!);
}
}
→Ex2_9.java:4: 文字列リテラルが閉じられていません。
System.out.printf(“Hello!);
^
Ex2_9.java:5: ‘)’ がありません。
}
^
■println(); の ; (セミコロン)を削除してみた
class Ex2_10
{
public static void main(String [] args) {
System.out.println(“Hello!”)
}
}
→Ex2_10.java:5: ‘;’ がありません。
}
^
■println() の 後括弧を削除してみた
class Ex2_11
{
public static void main(String [] args) {
System.out.println(“Hello!”;
}
}
→Ex2_11.java:4: ‘)’ がありません。
System.out.printf(“Hello!”;
^
■main() { に対応する } を削除してみた
class Ex2_12
{
public static void main(String [] args) {
System.out.println(“Hello!”);
}
→Ex2_12.java:6: ‘}’ がありません。
^
■class { に対応する } を削除してみた
class Ex2_13
{
public static void main(String [] args) {
System.out.println(“Hello!”);
}
→Ex2_13.java:6: ‘}’ がありません。
^
■System.out.printlnの前の空白に全角空白(漢字モードでスペースを押す)を入れてみた
class Ex2_14
{
public static void main(String [] args) {
System.out.println(“Hello!”);
}
}
→Ex2_14.java:4: \12288 は不正な文字です。
System.out.printf(“Hello!”);
^
本講は、プログラミングⅠ演習の内容を補足するような演習を中心に授業を進めるが、クラスによっては、プログラミングⅠの範囲を超えて関連する発展演習を行なうなど、多角的な方法でプログラミング技術の習得を行なう。
| 回数 | 内容 | 資料 |
| 1 | 導入講義 | |
| 2 | インデント、コメントのつけ方、文字列・文字・数値リテラル、特殊文字について演習する。(2.2, 2.3) | 資料 |
| 3 | 変数の宣言および代入方法、キーボードからの入力方法について演習する。(3.1, 3.2, 3.3, 3.4, 3.5, 3.6) | 演習 |
| 4 | 式と演算子の種類と使い方について演習する。(4.1, 4.2, 4.3, 4.4) | 演習 |
| 5 | if文、if~else文と関係演算子について演習する。(5.1, 5.2, 5.3, 5.4) | 演習 |
| 6 | 復習 | 演習 |
| 7 | switch文について演習する。(5.5) | 演習 |
| 8 | 論理演算子について演習する。(5.6) | 演習 |
| 9 | for文について演習する。(6.1) | 演習 |
| 10 | while文について演習する。(6.2) | 演習 |
| 11 | 文におけるネストについて演習する。(6.4) | 演習 |
| 12 | break、 continueについて演習する。(6.5) | 演習 |
| 13 | 総合復習 | 演習 |
| 14 | 総合復習 | 演習 |
| 15 | 定期試験 |
