解答には続きがあり、変数を参照型に変更すればfinallyブロックの処理が適用されるはずだとあります。
次のように、参照先が変わらない例を用いると良いです。
Java
1import java.util.*;
2
3
4class Main {
5 static List<Integer> func1(List<Integer> list) {
6 try {
7 System.out.println("try");
8 throw new RuntimeException();
9 }
10 catch(RuntimeException e) {
11 System.out.println("catch");
12 return list;
13 }
14 finally {
15 System.out.println("finally");
16 list.add(42);
17 }
18 }
19
20 public static void main(String[] args) {
21 var list = new ArrayList<Integer>(List.of(1, 2, 3));
22
23 System.out.println(list);
24 func1(list);
25 System.out.println(list);
26 }
27}
実行結果 Wandbox
[1, 2, 3]
try
catch
finally
[1, 2, 3, 42]
結果として反映されないのですが理由がわかりません。
再代入が発生しているからです。
代入前と代入後の変数valは、指し示すオブジェクトが違います。
Java
1val += 10;
2
3これは、次のように書いたのと同じ。
4
5val = val + 10;
これは先の例を少し改変しても再現できます。
Java
1import java.util.*;
2
3
4class Main {
5 static List<Integer> func1(List<Integer> list) {
6 try {
7 System.out.println("try");
8 throw new RuntimeException();
9 }
10 catch(RuntimeException e) {
11 System.out.println("catch");
12 return list;
13 }
14 finally {
15 System.out.println("finally");
16 //list.add(42);
17 list = List.of(9, 8, 7);
18 }
19 }
20
21 public static void main(String[] args) {
22 var list = new ArrayList<Integer>(List.of(1, 2, 3));
23
24 System.out.println(list);
25 func1(list);
26 System.out.println(list);
27 }
28}
実行結果 Wandbox
[1, 2, 3]
try
catch
finally
[1, 2, 3]
まとめ
Java
1} catch(RuntimeException e) {
2 val = 10;
3 return val; // この時点で返すべきvalオブジェクトが決まっている。
4} finally {
5 val += 10; // 新しいオブジェクトを再代入しても元のオブジェクトには反映しない。
6}
変数とオブジェクトの差を意識しないとなかなか気付きづらいです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/07/23 10:25
2019/07/23 10:37
2019/07/23 10:45
退会済みユーザー
2019/07/24 00:59