Javaコラム Javaエンジニアのためのお役立ちコラム

Javaはgotoを使える?詳しく解説!Javaではgotoは使えないが、代わりの手段は沢山ある

2021年08月10日
SE
Javaのgotoとはどのようなものなのでしょうか。
PM
Javaのgotoについて概要などを説明しますので、一緒に見ていきましょう。

Javaのgotoとは?


gotoという命令文が使えるプログラム言語は多くあります。BASICやC言語、C#といった言語はgoto文を使用できます。Javaでのgotoについて解説する前に、gotoがどんな命令文なのかを解説しましょう。

このプログラムはBASICで記述されていて、inputで入力された内容をprintで表示して、それを永久に繰り返します。繰り返しはgotoで行番号10の行に戻ることで実現しています。gotoとはプログラムの指定された箇所に移る命令なのです。

行番号がない言語はラベルにジャンプする

ただしプログラム言語の多くはBASICと違って行番号がありません。そういった言語のgotoはラベルにジャンプします。以下はC言語でgotoを利用した例です。

実行すると以下のように表示されます。cntが3になるまでラベルのLOOPの箇所にgotoで戻って繰り返しています。

1回目です
2回目です
3回目です

Javaでgotoを使用してみる

では上のC言語のサンプルと同じ処理をJavaで記述してみましょう。以下のようになります。

しかし、結果はgoto LOOPの箇所がエラーになります。なぜでしょうか。

Javaでgotoは使えない

結論から言うと、Javaでgotoは使えません。gotoについてネットで調べると、gotoを使うことに否定的な意見が多く見られます。BASICと違いC言語やJavaは構造化プログラミング言語であり、gotoのように処理を直接制御するような命令文は使うべきでないとされているからです。

ちなみにBASICのような行番号がある言語は手続き型プログラミング言語と言います。しかし現在多く使われているVisual Basicでは行番号もgotoも使用しないのが普通なので、gotoを使うプログラミングは推奨されてないと言えるでしょう。

Javaではgotoは予約語になっている

ただ、上のJavaサンプルを入力して不思議な事に気付いた人もいるでしょう。Eclipseなどの環境で入力した場合、gotoはエラーになるものの、intやifなどと同じように色付けされています。

それはgotoがJavaの予約語だからです。そのため以下のようにgotoを変数名に使用するとエラーになります。

これは矛盾しているように感じますが、Javaでgotoを使えなくしたものの、C#などのライバルの言語では使えるため、Javaでも将来使えるようにできる可能性を残したのだと思われます。

breakでgotoに近いことが出来る

ではJavaではgotoのようなことはできないのでしょうか?実はgotoに変わる方法があります。以下のサンプルをご覧ください。

break+ラベル名でgotoに近いことが出来る

Javaは上のサンプルのようにwhileループやforループの前に「ラベル名+:」を記述することができます。そして「break+ラベル名」でループから抜け出すことが出来るのです。結果は以下のようになります。while(true)の無限ループから3回目で抜け出すことで、C言語のサンプルと近い事が実現できています。

1回目です。
2回目です。
3回目です。

ラベル付きbreakの有効な使い方

ただし上のJavaサンプルでは、ラベルがなかったとしても普通のbreakで同じように動作します。ラベル付きbreakの有効な使い方は以下のような多重ループのケースです。

ラベル付きbreakでスマートに

上のJavaサンプルの実行結果は、

0 0
0 1

となります。iが0の時にjが1だったらそこでループを打ち切っています。これをもしラベルを使わないで行う場合、以下のようにフラグを使う必要があります。ラベルを使えばスマートになりますね。

ラベル付きcontinueも便利

Javaはループをスキップする命令文のcontinueにもラベルを付けることが出来ます。以下がその例です。

ラベル付きcontinueも有効活用しよう

上のJavaサンプルを実行すると以下の結果になります。jが2の時の処理がcontinueでスキップされています。

0 0
0 1
1 0
1 1
2 0
2 1

もしラベル付きcontinueを使わずに同じことをする場合、以下のようになります。こちらはラベル付きbreakを使わない時よりさらに複雑になりますね。

例外処理もgotoに近いことが出来る

他にgotoに近いことが出来るJavaの機能は、例外処理です。以下のようにすれば可能です。

上のJavaサンプルのように、Exceptionクラスを継承して独自のExceptionクラスを作って、必要な場合にそれをthrowして、try~catchでその独自の例外を受ければ、意図通りに制御をスキップすることができます。これはgotoに近いと言えるでしょう。

また例外処理を使うことで、処理をスキップする意図も明確になります。逆に、gotoはそう言った意図が分からないからJavaで採用されなかったと言えます。

SE
Javaではgotoが使えないのですね。
PM
gotoは使えませんが、gotoと同様の効果があるラベル付きのbreakなどで代用ができることを理解しておきましょう。

Javaではgotoは使えないが、代わりの手段は沢山ある

Javaのgotoについて解説しましたが、ご理解頂けましたでしょうか。Javaではgotoは利用できませんが、ラベル付きのbreakやcontinue、try~catchの例外処理でgotoと同じことが出来ることが分かったと思います。

むしろそういった特定の機能を使った方がgotoより意図が明確になるので望ましいでしょう。Javaの設計思想が良く考えられていることがお分かり頂けたのではないでしょうか。


Javaでのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

recommended

Categories

Tags