戻り値とvoidを理解する
戻り値はメソッドが呼出し元へ返す一つの値です。画面への表示とは別で、戻り値があるだけでは表示されません。void、return、型、正常終了する経路の関係を確かめます。
この単元で学ぶこと
- 戻り値と標準出力を区別する
- voidと値を返すメソッドの宣言を使い分ける
- returnの位置と型を検証する
本文解説
戻り値を使う static int twice(int n){return n*2;}にtwice(4)と渡すと式の値は8です。int x=twice(4);で受け取ったり、System.out.print(twice(4));で表示したりできます。twice(4);だけでも合法ですが、返された値を利用しないためこのメソッド自体から表示は出ません。
表示との違い static void show(int n){System.out.print(n*2);}は表示しますが値を返しません。show(4);なら8が出ますが、int x=show(4);は不正です。標準出力へ文字を書くことと、式の値を呼出し元へ渡すことは別の通信経路です。
voidで戻る voidメソッドでは末尾に到達すると呼出し元へ戻ります。途中で戻りたい場合はreturn;を使えます。static void show(int n){if(n<0)return;System.out.print(n);}なら負数のとき表示前に戻ります。return 1;のように値を付けることはできません。
値を返す経路 static int abs(int n){if(n<0)return -n;return n;}のように、正常に終わる経路で値を返す必要があります。if(n>0)return n;だけで末尾に到達するintメソッドはコンパイルエラーです。「今回正数を渡す予定」でも宣言の不備は解消しません。
型を合わせる static long f(){return 1;}はintからlongへ拡大できるので合法です。static int f(){return 1L;}はlongからintへ暗黙に縮小できず不正です。戻り値の型は呼出し元の受取変数の型も制約します。doubleの値をint変数へそのまま受け取れません。
returnで終わる範囲 returnは現在実行しているメソッドから戻ります。呼出し元の後続処理まで自動で終了するわけではありません。static int f(){return 2;}をSystem.out.print(f());System.out.print("X");と呼ぶと2Xです。ループからだけ抜けるbreakとは範囲が違います。
式を評価してから返す static int f(){int n=3;return n++;}は3を返します。後置増分式の値は増分前の3であり、前置の++nなら4です。戻り値を返した後の通常文は実行できず、無条件returnの後に文を置くと到達不能としてコンパイルエラーになります。
参照を返す 配列などの参照も戻り値になります。static int[] make(){return new int[]{1,2};}の戻り値からlengthを読むと2です。static String f(){return null;}も合法ですが、受け取ったnullにlength()を呼ぶと実行時例外になります。値を返せる型と、その値を安全に使えるかは別に確認します。
図解
重要ポイント
- 戻り値は表示とは別。
- voidの呼出しを値として代入できない。
- 値を返すメソッドは正常に終わる経路で値を返す。
- returnは現在のメソッドから呼出し元へ戻る。
間違えやすい点
- 戻り値を使わなければ必ずコンパイルエラーになると思わない。
- voidに数値を返さない。
- コンパイル可能なnull返却を安全な参照利用と混同しない。
用語解説
- 戻り値
- 呼出し元へ返す式の値。
- void
- 値を返さないことを表すメソッドの結果指定。
- return
- 現在のメソッドから戻る文。
- 到達不能
- 実行が到達できず、規則によりコンパイルが拒否される文の状態。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。