Javaでのラベル付きbreakの使い方

2643 ワード

Androidのブレークポイントアップロードを研究していたら、javaの面白い書き方に出会って、break+ラベルが蓄積されていました.
package com.zhcv.example.socket.util;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PushbackInputStream;

public class StreamTool {

	public static void save(File file, byte[] data) throws Exception {
		FileOutputStream outStream = new FileOutputStream(file);
		outStream.write(data);
		outStream.close();
	}

	public static String readLine(PushbackInputStream in) throws IOException {
		char buf[] = new char[128];
		int room = buf.length;
		int offset = 0;
		int c;
		loop: while (true) {
			switch (c = in.read()) {
			case -1:
			case '
': break loop; case '\r': int c2 = in.read(); if ((c2 != '
') && (c2 != -1)) in.unread(c2); break loop; default: if (--room < 0) { char[] lineBuffer = buf; buf = new char[offset + 128]; room = buf.length - offset - 1; System.arraycopy(lineBuffer, 0, buf, 0, offset); } buf[offset++] = (char) c; break; } } if ((c == -1) && (offset == 0)) return null; return String.copyValueOf(buf, 0, offset); } /** * * * @param inStream * @return * @throws Exception */ public static byte[] readStream(InputStream inStream) throws Exception { ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = -1; while ((len = inStream.read(buffer)) != -1) { outSteam.write(buffer, 0, len); } outSteam.close(); inStream.close(); return outSteam.toByteArray(); } }

readLine関数のwhile(true)デッドループエッジにはラベルloopがあり、switch文caseにはbreak loop文があります.もともとC言語ではgoto+タグの文しか見たことがありませんでした.break+ラベル文が指定した文を終了するために制御されている文であることを確認するには、関連資料を検索します.
以下に2つの例を示します.
	public class H {
		public static void main(String[] args) {
			{
				back: for (int i = 0; i < 10; i++) {
					if (i == 9) {
						System.out.println("break");
						break back;
					}
				}
				System.out.println("test");
			}
		}
	}

印刷結果は
break
test
一つ見てる
	public class H {
		public static void main(String[] args) {
			back:{
				 for (int i = 0; i < 10; i++) {
					if (i == 9) {
						System.out.println("break");
						break back;
					}
				}
				System.out.println("test");
			}
		}
	}
印刷結果:
break
ラベル付きbreakは、ラベルが指す場所から管理されている「領空」を脱退し、ラベルが指す場所から実行を再開しないため、控訴コードは、指すforから無限死サイクルを開始しません.