【Java初心者】戻り値利用時の注意点

戻り値を返す処理であるreturn文は、メソッド利用時に有効な手段ですが、
使用する際には注意しなくてはならない点が多々あります。
使用時の注意点について図や実際のコードを用いてしっかり説明していきます。

戻り値の役割と制限について

戻り値は、使用できればメソッド利用になくてはならない存在となります。
しかし、戻り値を利用する際にはいくつか注意すべき制限がございます。
この制限を理解しておかないとコンパイルエラーなどに
悩まされることになりますので覚えておいてください!

戻り値についての説明記事も書いているので戻り値がわからない方はこちらをご覧ください!
【Java初心者】戻り値の仕組みと使い方

return文で処理が終了

実はreturn文には、処理の結果を呼び出し元メソッドに返す以外にも
メソッド内で担っている役割があります。
それは、return文が実行された時点でそのメソッドの処理が終了するという役割です。

もちろんreturn文がなくとも処理がなくなればそのメソッドは終了しますが、
return文を書くことで明示的に処理が終わらせて、
mainメソッドに処理が戻ることを示すことができます。

そして、return文の後ろに処理を記述するとコンパイルエラーになるため
return文はメソッドの最後に記載するようにしましょう。

	public static void main(String[] args) {
		int a = 1;
		int b = 2;
		int result = 0;
		result = methodA(a,b);
		System.out.println(result);
	}
	public static int methodA(int a,int b) {
		int c = 0;
		c = a +b;
		return c;                      ⇦呼び出し元に処理が戻る
	   ❌ a = 2;                           ⇦return文の後ろに処理を書いているためコンパイルエラー
	}

条件分岐は必ずreturn文を経由するように!

戻り値を返すためのreturn文はif文などの条件分岐の中でも記載することができます。

ただし、戻り値を利用するメソッドの処理はreturn文で終わらなくてはいけません。
以下のコードのように、条件分岐で、
条件次第では戻り値を返さない場合がある
という仕組みの処理ではコンパイルエラーになってしまいます。

なぜエラーになってしまうのかと言うと、メソッド宣言時にデータ型を指定して、
このメソッドは指定したデータ型の戻り値を必ず返します」と
宣言しているにも関わらず戻り値を返さない可能性が出てきてしまうためです。

	public static void main(String[] args) {
		int a = 1;
		int b = 2;
		int result = 0;
		result = methodA(a,b);
		System.out.println(result);
	}
	public static int methodA(int a,int b) {
		int c = 0;
		c = a +b;
		if(a == 1) {
			return c;
		}else {
			❌                           if文の条件を満たさない場合に戻り値を返せなくなってしまう。
		}
	}

そこで、条件分岐の際も必ず戻り値を返すことができるような
ソースコードの書き方をいくつかご紹介いたします。

条件式全てにreturn文を書く

全ての条件分岐の処理の中にreturn文を書く方法です。
下記は、条件に通れば変数cを返し、
条件を満たしていなければ変数dを返すというコードです。

この方法であれば、if文でどんな条件になっても
必ず値を返すことができるため実行可能です。
しかし、return文を何度も書いているのであまりいいコードとは言えません。

	public static void main(String[] args) {
		int a = 1;
		int b = 2;
		int result = 0;
		result = methodA(a,b);
		System.out.println(result);
	}
	public static int methodA(int a,int b) {
		int c = 0;
		int d = 0;
		c = a +b;
		d = b - a;
		if(a == 1) {                                        条件に一致した場合もしなかった場合も戻り値を返す
			return c;
		}else {
			return d;
		}
	}

条件式内と最後にreturn文を書く

条件を満たした場合と、条件式が終わった後にreturn文を書きます。
この場合は、条件を満たした場合は条件式内のreturn文で処理を終了し、
条件を満たさなかった場合には条件ブロックを抜けた後のreturn文で処理を終了します。
こちらの処理もreturn文を2つ書いているのであまりお勧めはできません。

return文の後ろに処理を書いてはいけないルールがありますが、
条件分岐によって必ずどちらか一方の処理しか行わない場合には、
その場合ごとにreturn文が最後の処理になっていれば問題ありません。

	public static void main(String[] args) {
		int a = 1;
		int b = 2;
		int result = 0;
		result = methodA(a,b);
		System.out.println(result);
	}
	public static int methodA(int a,int b) {
		int c = 0;
		int d = 0;
		c = a +b;
		d = b-a;
		if(a == 1) {
			return c;
		}else {

		}
		return d;
	}

return文は最後に一つだけ書く

return文を最後に1つだけ記載する処理です。
1つだけであれば必ずそのreturn文まで処理が来ることが確定しており、
後々のメンテナンスもしやすくなるため最も綺麗な形です。

以下のコードでもわかる通り、これまでと同様の処理を行っていますが、
利用する変数もreturn文も少なく済み、コードの量も減るためミスも少なくなります。

	public static void main(String[] args) {
		int a = 1;
		int b = 2;
		int result = 0;
		result = methodA(a,b);
		System.out.println(result);
	}
	public static int methodA(int a,int b) {
		int c = 0;
		if(a == 1) {
			c = a + b;	
		}else {
			c = b - a;
		}
		return c;
	}

条件式の中でreturn文を書きたくなるシーンも多く出てくると思いますが、
コードが煩雑になった際にはreturn文を本当に複数使う必要があるのか
一つにまとめられないかをもう一度考え直してみましょう。

値は一つしか返せない

1つのメソッドから返すことができる戻り値は一つだけです。

戻り値は引数と同時に学ぶ方が大多数のため、混同してしまうことがよくあります。
呼び出し元メソッドから呼び出し先メソッドに渡す引数は
いくつでも渡すことができますが、戻り値はたった一つの値しか返せません。

計算式に例えて考えるとわかりやすいかもしれません。
計算式に使う数字の要素はいくつ存在していても問題ありませんよね?
それが引数です。
逆に計算式の答えは必ず1つになります。それが戻り値です。

戻り値は1つだけ

まとめ

ここまで、戻り値を使用する際に気をつけるべきポイントは
まとめると以下になります。

  • 戻り値は1つのメソッドから必ず1つだけ
  • 戻り値の値が条件によって変わる場合もreturn文は1つにした方がいい
  • return文を通過するとメソッドの処理が終了する

何か処理が終わった後の結果は必ず1つになるということを覚えておけば、
間違ったコードを書いてしまうことも少なくなるのではないかと思います。

以上、参考になった方もならなかった方もみなさんありがとうございました!