본문 바로가기
Error & Fix

자바 Local variable '변수명' defined in an enclosing scope must be final or effectively final 에러 해결방법

by wakestand 2020. 12. 9.
반응형

해당 에러는 람다(Lambda)식을 사용할 때 발생하는 에러인데

String 배열 arr을 stream 형태로 변환한 뒤 forEach를 돌리면서

String s에 ABC를 넣어주려고 하는 코드인데

 

보면

Local variable '변수명' defined in an enclosing scope must be final or effectively final

이런 에러가 뜨는 것이 보인다

 

이건 람다 안이 anonymous inner class이기 때문에

자바 컴파일러가

val -> val과 같이 파라미터로 사용하는 변수와

로컬 변수를 구분을 하지 못하기 때문에

미리 저런 에러가 뜨는 것이다

 

즉 로컬 변수는

람다식 안에서 변경이 불가능하기 때문에

 

해결방법은 

 

위와 같이 변수를

클래스 단에서 만든 뒤에 사용해주면 된다

 

마지막으로 예제에 사용한 코드는 아래와 같다

 

public class Test1 {
	String s = "";
	public static void main(String[] args) {
		String[] arr = {"A", "B", "C"};
		Test1 t1 = new Test1();
		Arrays.stream(arr).forEach(val -> {
			t1.s = t1.s + val;
		});
		System.out.println(t1.s);
	}
}
반응형

댓글