Javaについて徹底解説!

for/while/switch文を抜けるbreak! Javaのbreakを丁寧に基本から

大石 英人

開発エンジニア/Java20年/Java GOLD/リーダー/ボールド歴2年

Javaのbreakは、ループ文やswitch文をすぐに終了させて、抜けるためのものです。プログラムを作る上では欠かせないものです。

breakはやっていることそのものは大変シンプルで、しかもループ文があるプログラミング言語であれば名前は違えども必ずあるものですので、使い方もそんなに難しいものではありません。知ってるよ、という方も多いでしょう。

ただ、breakには広く知られている基本的なものとは少し違う使い方が、実はあるのです。これを上手く使うとプログラムが作りやすく、読みやすくなるので、この記事をお読みになって、ぜひ使えるようになっていただきたいです!!

この記事では、breakについて基本からちょっとした応用まで、幅広く初心者向けにお伝えします。

※この記事のサンプルは、Java 11の環境で動作確認しています


1.breakの基本

ここではbreakの基本を学びましょう。breakfor/while/do-while文でのループやswitch文で使うのが普通ですので、それぞれ実例を交えて説明します。

なお、breakを実行する時は「breakする」というように呼ぶのが普通なので、以下でも同じように呼ぶことにします。

1-1.ループ(for/while/do-while)でのbreak

for文、while文、do-while文などのループ中でbreakすると、現在実行しているループ文そのものを抜けて、ループ文の次の処理に移ります。breakはループ文中のどこからでもできます。

なお、ループ文でbreakするということは、もうそのループ文ではすべきことがないと判断した、ということです。ですので、ループ文でのbreakは、breakすべきか判断するif文と組み合わせるのが普通です。

実行結果

実行結果

実行結果

1-1-1.breakとcontinueの違いはループが終わったあとの動き

breakとcontinueは「今実行しているループを終わらせる」という役割は同じですが、終わらせたあとにどうするかが違います。ループ文そのものを抜けるか(break)、次のループを行うか(continue)です。continueという言葉は「続ける」ですし、イメージ的にもぴったりですよね。

1-2.ネストしたループ文からのbreak

for/while/do-while文はネスト(nest、入れ子、何かの中に何かを含むこと)させられます。ループ分がネストした状態でbreakすると、breakしたところから「最も近い」ループから抜けることになります。

例えば以下では、breakしているところから「上へ」たどっていって、もっとも近いループ文である「jfor文」をbreakします。ですから「ifor文」はそのまま何事もなかったかのように続くのです。

実行結果

ですので、ループがネストした状態でbreakをすると、意図したとおりのbreakが難しくなります。もうこのループ全体を終わってもいいと、ネストが深いところにあるループ文で分かった場合は面倒です。ループ全体の継続要否を管理する変数を使ったりすることになります。

そういうプログラムは複雑になりがちです。しかし!! そういう用途に使えるよう、いくらループが深くなってもループ全体を一気にbreakするやり方がちゃんとあるのでご安心ください。それについては後述します。

1-3.switch文でのbreak

switch文でのbreakは、ループ文と似たような意味を持ち、switch文から抜ける動きをします。

Javaのswitch文で要注意なのが、breakをしなければ次にあるcaseに処理が移ってしまうことです。この動きを「フォールスルー(fall through)」とも呼ぶのですが、breakはそれを止めるためにもあるものです。

実行結果

実行結果

1-4.ネストしたswitch文からのbreak

ループ文と同じように、switch文もネストできます。その場合もfor文と同じで、breakをしたところから「最も近い」switch文をbreakすることになります。

実行結果

1-5.ネストしたループ文・switch文からのbreak

もちろん、ループ文とswitch文を組み合わせることはできます。その場合でもルールは同じで、breakをしたところから最も近いモノをbreakすることになります。

実行結果


2.【発展】breakは実はブロックを抜けるためのもの

2-1.breakとラベルとブロックの関係

breakは、実はブロックを抜けるためのものなのです。for/while/do-wihle文、switch文の中でしか使えないものではなかったりします。

ブロックとは、プログラムの中で “{}” で囲まれた部分を表す言葉です。for/while/do-while文の{}switch文の{}if文の{}try{}など、それらはすべてブロックです。そして、ブロックはそれらの構文とは関係なく、自由に作ることができるものです。

今まで見てきたbreakは、抜けるブロックをプログラマが指定しない時のデフォルトの動きです。ループ文やswitch文では、breakをした場所から最も近いループ文・switch文のブロックが選ばれてbreakされるということです。

breakでどのブロックから抜けるかは「ラベル」という文字列で指定できます。ラベルを使って、ブロックに名前をぺたりと貼り付けるイメージです。そうして付けたラベルでbreakすると、そのラベル付けされたブロックを抜けます。

まあ、物は試しです。ブロックにラベルを付けるところから、ラベル付きブロックをbreakするところまでをざっと一通りやってみましょう!!

2-2.ラベルの付け方

2-2-1.ラベルは文字列 + “:”でつける

ラベルは、ラベル文字列の後ろにコロン(:)を付けると宣言できます。ラベル文字列には普通の変数などと同じ文字が使えます。ラベル文字列は、ラベルだとすぐ分かるように、大文字が使われることが普通です。

2-2-2.ブロックへのラベル付けはブロックの先頭で行う

ブロックにラベル付けするには、以下のようにブロックの始まりを表す “{” の前にラベルを置きます。for/while/do-while/switch/tryのブロックにラベル付けをする時も同じで、それぞれのキーワードの前にラベルを置きます。

もちろん、ラベル付けしたブロックがたくさんネストしていても大丈夫です。それぞれのブロックに、ラベル付けがされます。

ただし、同じラベルのブロックの中では、既に使われているラベルを使えません。ブロックの区別が付けられないからで、この考え方は変数のスコープと似ています。

ですが、外にある違うブロック同士なら同じラベルでも問題ありません。なぜかと言えば、ラベルの有効範囲は紐づけたブロックの中だけだからです。

2-2-3.【参考】ラベルは文へ付けられるもの

ラベルは実は文(Statement)として扱えるものに付けられるのです。ただ、今のJavaの構文上で実用的に使えるのは、breakと組み合わせるためのブロックへのラベルです。この記事はbreakが題材なので、breakしたいブロックへのラベルの付け方を紹介しています。

2-3.ラベルを使ったブロックからのbreak

2-3-1.ラベル付きブロックをbreakする

いよいよラベル付きブロックをbreakしてみます。以下のように、breakの後ろにbreakしたいラベル文字列を指定しましょう。

実行結果

そして、ネストしたブロックでも、親のブロックに付けたラベルを指定すれば、一気に抜けることができるのです!!

実行結果

2-3-2.ラベル付きループ文/switch/try文をbreakする

では、ループ文/switch/try文でラベル付きbreakをしてみましょう。それぞれで、ネストが最も深いところから、ラベルが付いたブロックを直接breakできていることが分かると思います。

実行結果

実行結果

なお、try-finallyの場合はbreakした後にfinallyが実行されます。他の文と少し違いますので覚えておきましょう。

実行結果

2-4.ラベルを使ったbreakはどういう時に使うのか

ラベルを使ったbreakは、以下を行いたい時に使います。特に2はループに限らず使えるのがいいところです。

  1. 深いネストから一気に脱出する時
  2. ブロック全体の実行を終えてもいい時

1.は、ネストを構成するループ文やswitch文全体で、ループ継続状態を管理する必要がなくなります。また、ネストした全てのブロックを一気に脱出しなくてもよく、途中での必要なブロックだけにもできるので、柔軟に活用できます。

2.は「この条件を満たせばブロックの中はこれ以上実行しなくてもいい、でもまだ後には処理があるのでメソッドからのreturnはできない」というケースで使うと効果的でしょう。if文などが減らせるので、プログラムが簡素化できます。

なお、ラベル付きbreakはいわゆるGOTO文ではありません。ずっとお伝えしているとおり、breakしたブロックを抜けて、ブロックの次にある処理に速やかに移るためのものです。

GOTO文で出来るような、処理をさかのぼってのループなどは、ラベル付きbreakではできません。メソッドをまたがったbreakもできません。ですから、Javaではプログラムはは必ず上から下に順番どおりに流れるのです。


3.【発展】breakのいろいろ

3-1.Streamではbreakできない

Java 8から追加されたStream APIはループ文に似た処理ができます。ですが、あくまで「ループに似たもの」であり、構文上のループ文ではないのでbreakはできません。

Streamは、正確に言えば何かの集まりにある要素一つ一つに対して処理を並行にやるための仕組みであって、ループ的に何かをするわけではないからです。ですので、要素一つに対する処理をreturnで中断することはできますが、ループ文と同じようにStream全体を中断することはできないのです。

ですので、ループ中で中断する必要があるなら従来どおりfor/while文を使うことになります。また、似た結果を得るなら、Stream上で不要なデータを除外するために、中間処理としてfiltertakeWhile(Java 9以降)をするなどの方法があります。

3-2.ループではなるべく早いタイミングでbreakすべき

ループ中でbreakできるなら、なるべく早いタイミングで行うのがいいと考えます。returnには早期returnという考え方がありますが、breakcontinueにも同じようなことが言えます。

ループ中ではbreakできるなら早くやってしまえば、そこから後ろの処理ではbreakする条件以外であるということが明確になりますので、ループ文などの全体的な見通しが良くなります。

今のプログラムでbreakをしてる箇所は、本当にそこで行わなければならないのか考えてみましょう。もっとシンプルにできるかもしれません。ただ、最初にbreakをしたいがために自然なロジックを捻じ曲げるべきではありませんので、バランス感覚が大事です。


4.まとめ

この記事ではbreakの使い方についてお伝えしてきました。breakはループ文やswitch文を途中で中断して、後続の処理を実行するためにあるものです。

そして、実はbreakは、ラベル付きブロックの中断もできます。ラベルは、ループ文、switch文、try文などの他にも、ごく普通のブロックにも付けられます。ラベル付きブロックのbreakは上手く使えばプログラムを分かりやすくする効果がありますので、活用できそうか考えてみましょう。

私たちは、全てのエンジニアに市場価値を高め自身の望む理想のキャリアを歩んでいただきたいと考えています。もし、今あなたが転職を検討しているのであればこちらの記事をご一読ください。理想のキャリアを実現するためのヒントが見つかるはずです。

8/28(水)開催決定!
【テックジム×ENGINEER.CLUB】ゼロからはじめるPythonプログラミング入門講座

プログラミングは初めてだけどPythonから始めてみたいという方のために、無料のハンズオン開発講座をテックジム×ENGINEER.CLUBで共同開催することになりました。開催日時は以下の通りです。

  • 8月28日(水)19時〜21時 東京開催

本講座で学んでいただく「TechGYM方式」とは、基礎知識なしでも座学なしでプログラミングに専念できるように設計されたプログラミングのカリキュラムメソッドです。「まるで魔法にかかったようにプログラミンスキルが習得できる」と評判の本講座をぜひ一度体験してみてください。

『技術力』と『人間力』を高め市場価値の高いエンジニアを目指しませんか?

私たちは「技術力」だけでなく「人間力」の向上をもって遙かに高い水準の成果を出し、関わる全ての人々に感動を与え続ける集団でありたいと考えています。

高い水準で仕事を進めていただくためにも、弊社では次のような環境を用意しています。

  • 定年までIT業界で働くためのスキル(技術力、人間力)が身につく支援
  • 「給与が上がらない」を解消する6ヶ月に1度の明確な人事評価制度
  • 平均残業時間17時間!毎週の稼動確認を徹底しているから実現できる働きやすい環境

現在、株式会社ボールドでは「キャリア採用」のエントリーを受付中です。

まずは以下のボタンより弊社の紹介をご覧いただき、あなたの望むキャリアビジョンをエントリーフォームより詳しくお聞かせください。