【java解惑】居場所のないバグ

2426 ワード

次のコードを示します.
public class Example023 {

	public static void main(String[] args) {
		errorMethod();
		rightMethod();
	}

	private static void errorMethod() {
		StringBuffer word = null;
		Random rnd = new Random();
		switch (rnd.nextInt(2)) {
		case 1:
			word = new StringBuffer('P');
		case 2:
			word = new StringBuffer('G');
		default:
			word = new StringBuffer('M');
		}
		word.append('a');
		word.append('i');
		word.append('n');
		System.out.println(word);
	}

	private static void rightMethod() {
		StringBuffer word = null;
		Random rnd = new Random();
		switch (rnd.nextInt(3)) { // error1
		case 1:
			word = new StringBuffer("P");// error2
			break;// error3
		case 2:
			word = new StringBuffer("G");// error2
			break;// error3
		default:
			word = new StringBuffer("M");// error2
			break;// error3
		}
		word.append('a');
		word.append('i');
		word.append('n');
		System.out.println(word);
	}
}

出力結果:
第1行の出力は常にainであり、第2行の出力結果は予想される効果に達し、pain,gain,mainのランダムを出力する.
コード解析:
1行目の出力に対応する関数はerrorMethod、2行目に対応する関数はrightMethodです.errorMethodでは、3つのバグが存在します.
  • の最初のバグは、選択された乱数であり、switch文はその3つの場合の2つにしか到達できない.Random.nextInt(int)の仕様は、「0(含む)から指定された数値(含まない)までの間に擬似ランダムで均等に分布するint数値を返す」と記述している.これは式rndを意味する.nextInt(2)の可能な値は0と1しかなく、Switch文はcase 2ブランチに永遠に届かない.これは、プログラムがGainを印刷しないことを示している.nextIntのパラメータは2ではなく3であるべきである.
  • の2番目のバグは、異なる状況(case)にbreak文がないことです.
  • の最後の1つで、最も微妙な1つです.bugは式new StringBuffer('m')で、あなたが望んでいることは何もしていないかもしれません.StringBuffer(char)コンストラクタに詳しくないかもしれませんが、これは簡単に説明できます.それは根本的に存在しません.StringBufferには、パラメータのないコンストラクタと、Stringを文字列バッファの初期コンテンツとして受け入れるコンストラクタと、intをバッファの初期容量として受け入れるコンストラクタがあります.この例では、コンパイラはintを受け入れるコンストラクタを選択し、元のタイプの変換を広げることで文字数値'm'をint数値77に変換します.すなわち、new StringBuffer('m')は、初期容量77を有する空の文字列バッファを返す.プログラムの残りの部分は、この空の文字列バッファに文字a、i、nを追加し、文字列バッファの常にainの内容を印刷します.ここで覚えておきたいのは、charはstringではなく、intのようなものです.

  • (注:本【java解惑】シリーズは、いずれもブロガーが『java解惑』原書を読んだ後、原書の説明と例の部分を改編し、ブロガーに書いて発表したものである.すべての例は自らテストに合格し、githubに共有されている.これらの例を通じて、自分を励まし、他人に恩恵を与える.同時に、本シリーズのすべてのブロガーはブロガー個人の微信公衆番号(「愛題猿」または「ape_it」を検索する)に同期して発表される.みんなが読むのに便利です.もし文の中に原作者の権利を侵害する内容があれば、直ちにブロガーに知らせて、直ちに削除してください.読者が文の内容に異議や問題がある場合は、ブログの伝言や微信の公衆番号の伝言などを通じて共同で検討することを歓迎します.)
    ソースアドレス:https://github.com/rocwinger/java-disabuse
    本文は“winger”のブログから出て、転載をお断りします!