dq37281757
@dq37281757 (dq37281757)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

拡張for文を使うと上手くいかない理由

Q&A

Closed

解決したいこと

RPGの戦闘プログラムを書いています。モンスターをランダムに生成するcreate()メソッド、生成したモンスターを配列に入れるmakeArray()メソッドを作りました。makeArray()メソッドの中で拡張for文を使ったのですが、「ローカル変数○○は使用されていません」の警告がなされ、モンスターの名前を表示しようとすると、配列にモンスターが入っていない趣旨のメッセージが出てエラーとなりました。なぜ拡張for文ではダメなのかが分からないので教えてもらいたいです。

発生している問題・エラー

Cannot invoke "characters.Monster.getSpecies()" because "m" is null

該当するソースコード

public class Test {

	public static Monster create() {
		int r = new java.util.Random().nextInt(4);
		switch(r) {
		case 0:
			return new Dragon();
		default:
            return new Slime();
		}
	}
	
	public static Monster[] makeArray() {
		int r = new java.util.Random().nextInt(8) + 1;
		Monster[] array = new Monster[r];
		for(Monster m : array) {
			m = create();
		}
		return array;
	}
    
    public static void main(String[] args) {
		Monster[] array = makeArray();
		for(Monster m : array) {
			System.out.println(m.getSpecies());
		}
	}
}

自分で試したこと

元々は拡張for文ではなく、普通のfor文を使って書いていて、その時はエラーが出ませんでした。でもコードが煩雑な気がして拡張for文にしたところ先ほどのエラーが出ました。

0

2Answer

そらJavaの拡張forは「値渡し」だからじゃないですかね…いちど値渡しと参照渡しについて調べてみるのもありかと思います。

0Like

Comments

  1. @dq37281757

    Questioner

    調べてみるとその手の記事がいっぱい出てきました。
    今まで全然知らずに使っていました。

    ありがとうございました。
  2. 言語によってこの形式のforで値渡しか参照渡しかは違うっていうところは頭の片隅に置いててくださいね
  3. @dq37281757

    Questioner

    肝に銘じておきます。ありがとうございます。

java の静的解析で 警告されるやつですね。
インスタンスなら変更はできるのですが、javaには参照渡しが無いので代入は無理ですね。( final を指定することが推奨されています。

Java 5で導入された拡張for文(for-each文とも呼ばれる)は、主に、オブジェクトのコレクションに対する繰り返し処理を行うために利用される。通常のfor文とは異なり、ループ変数への代入はオブジェクトに対する繰り返しの順序に影響を与えない。したがって、ループ変数への代入は、プログラマの意図に反した意味を持つかもしれない。このことからも、拡張forループのループ変数への代入は避けるべきである。

0Like

Your answer might help someone💌