メソッド使用でよくある間違いの例

次に4つ,誤りの例を示す。

List 1 メソッドをmain()中から呼び出し忘れた誤りの例

public class XXXX {
    public static void main(String[] args) {
        XXXX mainprg = new XXXX();
    }
  
    XXXX() {
        double x=5.0;
        double y=8.0;
        double z=0.0;
       
/*ここでメソッド呼び出しを忘れた。「z=average(x,y);」と書くべき*/
        System.out.printf("%fと%fの平均値は%fです\n",x,y,z);
    }

    /*****************************
    2つの値の平均値を求めるメソッド
    入力:2つの実数引数p,q
    出力:メソッドの戻り値がp,qの平均値になっている
    ******************************/
    private double average(double p, double q) {
        double r;
        r=0.5*(p+q);
        return r;
    }
}

/********************* 実行結果 ********************
5.000000と8.000000の平均値は0.000000です
****************************************************/

解説
メソッド
private double average(double p, double q)の定義が書いてあるだけでXXXX()中から呼び出さなかった例。
main()の中を実行するだけなので,変数zには値が代入されないまま,変数x,y,zを表示している。
変数zの値が0.0なのは偶然で,値が代入される前の変数の値が0とは限らない。

List 2 メソッドの「返す値」を受け取らなかった誤りの例

public class XXXX {
    public static void main(String[] args) {
        XXXX mainprg = new XXXX();
    }
 
    XXXX() {
        double x=5.0;
        double y=8.0;
        double z=0.0;
        average(x,y);  /*メソッドから返された値を受け取らなかった場合*/
                       /*本当は「z=average(x,y);」と書くべき*/

        System.out.printf("%fと%fの平均値は%fです\n",x,y,z);
    }

    /*****************************
    2つの値の平均値を求めるメソッド
    入力:2つの実数引数p,q
    出力:メソッドの戻り値がp,qの平均値になっている
    ******************************/
    private double average(double p, double q) {
        double r;
        r=0.5*(p+q);
        return r;
    }
}

/********************* 実行結果 ********************
5.000000と8.000000の平均値は0.000000です
****************************************************/

解説
せっかくメソッドprivate
double average(double p, double q)中で平均値を計算し,メソッドは平均値を
返しているのにXXXX側で受け取って変数zに格納するのを忘れた例。
変数zの値が0.0なのは偶然で,値が代入される前の変数の値が0とは限らない。

List 3 メソッドの「返す値」を返す作業をしなかった誤りの例

public class XXXX {
    public static void main(String[] args) {
        XXXX mainprg = new XXXX();
    }
 
    XXXX() {
        double x=5.0;
        double y=8.0;
        double z=0.0;
        z=average(x,y);
        System.out.printf("%fと%fの平均値は%fです\n",x,y,z);
    }

    /*****************************
    2つの値の平均値を求めるメソッド
    入力:2つの実数引数p,q
    出力:メソッドの戻り値がp,qの平均値になっている
    ******************************/
    private double average(double p, double q) {
        double r;
        r=0.5*(p+q);
        /*あるべきはずの「return r」が無い場合*/
    }
}


/********************* 実行結果 ********************
XXXX.java:23: エラー: return文が指定されていません
    }
    ^
エラー1個
****************************************************/

解説
メソッドdouble average(double p, double q)が値を返すのを忘れている。
コンパイルエラーになる。

List 4 メソッド内で仕様にない画面表示を入れてしまった例
文法的誤りでもないし,実行時のエラーでもないが,このメソッドを呼び出した時に不要な表示が毎回現れる

public class XXXX {
    public static void main(String[] args) {
        XXXX mainprg = new XXXX();
    }
 
    XXXX() {
        double x=5.0;
        double y=8.0;
        double z=0.0;
        z=average(x,y);
        System.out.printf("%fと%fの平均値は%fです\n",x,y,z);
    }

    /*****************************
    2つの値の平均値を求めるメソッド
    入力:2つの実数引数p,q
    出力:メソッドの戻り値がp,qの平均値になっている
    ******************************/
    private double average(double p, double q) {
        double r;
        r=0.5*(p+q);
        System.out.printf("r=%f\n",r);
        return r;
    }
}

/********************* 実行結果 ********************
r=6.500000
5.000000と8.000000の平均値は6.500000です
****************************************************/

解説
メソッド中で不用意にprintfで表示している。
mainを作成するプログラマは
「5.000000と8.000000の平均値は6.500000です」のみの出力を期待している。
このメソッドを別のプログラムで利用する時,不必要な表示が出てきて困るであろう。