質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

5回答

6981閲覧

for文でreturn,breakされない場合があるか?

lupus_dingo

総合スコア257

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/08/27 08:38

編集2017/08/29 13:59

お世話になっています。

以下のような拡張for文なのですが、
returnでメソッドを終了してくれません。

java

1private EntityA get(List<EntityA> entitylist, Long id){ 2 3for (EntityA entity: entitylist){ 4 if(entity.getId()==id){ 5 return entity; 6 } 7} 8 return null; 9} 10 11//使用側 12EntityA entity = get(list, id); 13if(entity ==null){ 14 entity=getDb(id); 15 list.add(entity); 16}

代わりにbreakで試してみましたがやはりfor文を抜けませんでした。

ステップ実行で実際にreturnまでカーソルが移動することを確認していますが、for文は抜けないので結局nullが返ります。

return , break が効かない場合はあるのでしょうか?

[追記]
return null;の位置は誤記ですので修正しました。すみません。
return entity;の前で
printlnを試したところ、ログは出力されていませんでした。ただし、entity.getId()とidの中身もツールチップで出力してみたのですが、一致していることは確認しています。(ステップ実行でprintlnを通過しているが実際にはログは出力されていないということです。)

for文を抜けないというのは、
ifで条件一致しても中の処理が実行されず、結局要素数分ループが行われ、nullが返るという意味です。

[追記2]
for文の直後ではログは出力されています。
ステップ実行の環境はeclipse3.7です。

arrayListのループではなくHashMapのcontainsKeyに変更したところ(メソッドの戻り値も変更)うまく動作しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2017/08/28 02:17

ステップ実行ではなく、return entity; の上に System.out.println("found"); を追加して確認してみて下さい。
swordone

2017/08/28 03:22

「for文が抜けない」というのがどういう状況なのかわからないのですが…もう少し説明をお願いします。
momon-ga

2017/08/28 03:50

「printlnを試したところ、ログは出力されていません」と「ステップ実行で実際にreturnまでカーソルが移動することを確認」というのは矛盾してますが、勘違いということでいいですかね。
swordone

2017/08/28 10:36

forの直後、ifの前にSystem.out.println(entity.getId()==id);を置いて、一度でもtrueが出力されますか?
swordone

2017/08/28 15:03

もう一つ、ステップ実行は何で行っていますか(つまり、開発環境は何か)?
swordone

2017/08/29 14:12

HashMapでは同値判定はequalsで行うのでその対比は意味がありません。
guest

回答5

0

引数のidの型がLongですが、
longではないので、
entity.getId()の戻り値の型もLongだったりすると、
entity.getId()==id
がほぼほぼfalseになるのでは?

Java

1Long w = new Long(2); 2Long x = 2l; 3Long y = 2l; 4long z = 2l; 5 6System.out.println(w==x); // false 7System.out.println(w==z); // true 8System.out.println(x==y); // true 9System.out.println(x==z); // true

Java

1Long w = new Long(128); 2Long x = 128l; 3Long y = 128l; 4long z = 128l; 5 6System.out.println(w==x); // false 7System.out.println(w==z); // true 8System.out.println(x==y); // false 9System.out.println(x==z); // true

投稿2017/08/28 03:26

編集2017/08/28 04:31
ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lupus_dingo

2017/08/28 03:35 編集

おっと、、もしかしてラッパーされたロング型って==で比較してはいけないんでしたっけ?(^_^;) だとしたらすごい恥ずかしいです。。。
guest

0

自己解決

追記にも記載しましたが、

arrayListのループではなくHashMapのcontainsKeyによる処理に変更したところ(メソッドの戻り値も変更)うまく動作しました。
原因はわからずじまいですが、
代用できたのでこちらで対応しようと思います。お時間頂きすみませんでした。

投稿2017/08/29 14:02

lupus_dingo

総合スコア257

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2017/08/29 14:13 編集

HashMapの同値判定はequalsで行うため、その対比に意味がありません。
lupus_dingo

2017/08/29 14:29

回答ありがとうございます。 HashMapに変更することでメソッドの中身をかなり変えています。 元々、エンティティを返す必要がなくエンティティ内の特定のIntegerフィールドが取得したかっただけなので、メソッドの定義を private Integer get(Map<Integer, Integer> entityMap, Long id) に変えています。 (for文は削除しています) また、取得方法も entityMap.get(id) に変えています。
guest

0

java

1 private EntityA get(List<EntityA> entitylist, Long id) { 2 3 for (EntityA entity : entitylist) { 4 if (entity.getId() == id) { 5 return entity; 6 } 7 return null; 8 } 9 }

このままですと、for文の外で何もreturnできないため、このメソッドはコンパイルエラーになります。

以下が正しいのではないでしょうか?

java

1 private EntityA get(List<EntityA> entitylist, Long id) { 2 3 for (EntityA entity : entitylist) { 4 if (entity.getId() == id) { 5 return entity; 6 } 7 } 8 9 return null; 10 }

投稿2017/08/28 02:47

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lupus_dingo

2017/08/28 03:11

追記に記載しましたが、return null;の位置は誤記です。すみません。
guest

0

ソースの抜粋を提示していると思いますが、finallyで、return nullしてませんか?

投稿2017/08/28 02:03

momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lupus_dingo

2017/08/28 03:12

try-catch-finally が最初に思い浮かんだのですが、finallyは使用していませんでした。
guest

0

return nullを置く場所がおかしいです。
これではforの1周目で「リスト最初のエンティティ」かnullが返されます。
ということはリストに要素が無い場合forに入れないため、これはコンパイルエラーになるはずなのですが…

投稿2017/08/27 08:54

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lupus_dingo

2017/08/28 03:13

追記に記載しましたが、return null;の位置は誤記です。すみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問