Java “超”初心者が犯しやすい7つの過ち

http://journal.mycom.co.jp/news/2008/06/18/041/index.html
に触発されて。
ここのところ、大学で行われてる基礎ソフトウェア演習のTAやってまして、その結果『Java の超がつくほどの初心者が犯しやすい過ち』がだいたい見えてきたかなーという感じです。ということでまとめてみた。

クラス名に "." は使えません

public class Kadai1.1 {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}

問題用紙には「課題1.1」って書いてあるんですよ。

Java のプログラム構造を理解しましょう

クラス Animal を定義し、さらにメソッド barg を定義しなさい。

class Kadai3_2 {
    public static void main(String[] args) {
        class Animal {
        }
        void barg() {
        }
    }
}

Java が持つ構造を知らないと簡単に犯してしまう間違いですね。
メソッドの中に直接メソッドを書いてしまう人は、少なくとも10人はいました。

上から順に実行されます

「どうやって書けばいいんだろう」を「自分のやりたいことを考える」よりも前に考えてしまうんでしょうか。

public static void main(String[] args) {
    String input = iotool.Console.readLine();
    System.out.println("一行入力してください:");
}

この誤りは非常に多かったです。

メソッド定義と呼び出しは違いますよ

よく、Java の参考書とかに書いてありますよね。

java.lang.Math のメソッド: int abs(int x)

java やったことがあるとこれだけですんなり理解できるんですが、超初心者たちは、みんながみんな

public static void main(String[] args) {
    int x = iotool.Console.readInteger();
    int abs(int x)
}

って書くんですが、それは無理です。

public static void main(String[] args) {
    int x = iotool.Console.readInteger();
    public static int abs(int x)
}

ここまで書いた人もいた。

メソッド定義と呼び出しは違いますよその2

こんな人がいました。

class Kadai3_2 {
    public static void main(String[] args) {
        System.out.println("一行入力してください:");
        String input = iotool.Console.readLine();
    }
    void print(String input) {
        System.out.println("入力された文字列は:" + input);
    }
}

メソッドは定義されただけでは実行されません。ちゃんとメソッドを呼び出してあげてください。

メソッド定義と呼び出しは違いますよその3

度肝を抜かれたのが、この間違い。

class Kadai5_3 {
    public static void main(String[] args) {
        Fraction f = new Fraction(3, 4);
        int x = gcd(f.n, f.d);
        f.n = f.n / x;
        f.d = f.d / x;
        System.out.println(f);
    }
    static int gcd(int f.n, int f.d) {
        if (f.d == 0)
            return f.n;
        else
            return gcd(f.d, f.n % f.d);
    }
}

サンプルコードとかで同じ名前の変数が色んな箇所に登場すると、みんな同じ変数だと思っちゃうようです。

代入文と変数定義は違いますよ

class Kadai3_3 {
    public static void main(String[] args) {
        int a = iotool.Console.readInteger();
        String moji;
        if (a % 100 == 0) {
            String moji = "100で割り切れます";
        }
        else {
            String moji = "100で割り切れません";
        }
        System.out.println(moji);
    }
}

変数定義のフレーズだけ覚えていると、代入文がかけなくなっちゃうみたいです。

まとめ

これ以外にもいっぱいあるけど、とくに心に残ったのがこの7個でした。
これらの殆どは文法的な誤りなんですけど、特に Java の入門書には文法的な事柄が殆ど書いて無いですから、まあ致し方ないことなのかな、とは思っていたりします。
あと java は public とか static とか、初心者にとって冗長なものが多い印象がありますね。「今は何も考えずに書いてください。後の講義で説明します」っていう言葉、数回言った気がするし。


最後に。がんばれ超初心者どもよ。自分でプログラム書けるようになってくると楽しいよー!