본문 바로가기
Java/Java with Error

[해결 방법] Resource leak: '...' is never closed

by HJ0216 2023. 2. 12.

기본 환경: IDE: Eclipse, Language: Java

 

발생 Warning

Java에서 다음 Source Code를 실행할 경우,

package basic;

import java.util.*;

public class AvoidLeakage {

	public static void main(String[] args) {
		Scanner scan2 = new Scanner(System.in);
		System.out.println("Enter the String2: ");
		String s2 = scan2.next();
	}

}

Resource leak: 'scan2' is never closed

→ Warning  발생

 

 

Warning 원인

입력 시, 키보드 외에도 파일 등을 통해 입력을 받는 경우도 있음
(파일작업 순서: 파일 열기 → 파일 사용 → 파일 닫기)
⭐ 파일을 열어놓고 닫지 않을 경우, 파일이 손상될 수가 있으므로 파일 작업은 열고 닫는 과정을 명시적으로 입력해야 함
 스캐너 생성 시 파라미터로 값을 넘기게 되는데(new Scanner(System.in), in: 키보드 입력), 키보드 입력의 경우 close()를 해주지 않아도 상관 없지만 리소스를 사용하는 경우에는 되도록 close()해주는 습관을 들이는 것이 좋음

 

 

해결 방법

Scanner class type variable scan에 대한 close() 추가

package basic;

import java.util.*;

public class AvoidLeakage {

	public static void main(String[] args) {
		Scanner scan2 = new Scanner(System.in);
		System.out.println("Enter the String2: ");
		String s2 = scan2.next();
		
		scan2.close();
	}
}

⚠️ System.in으로 키보드를 통한 입력받을 대상이 남아있음에도 불구하고 close()할 경우 ,

package basic;

import java.util.*;

public class AvoidLeakage {

	public static void main(String[] args) {
		Scanner scan2 = new Scanner(System.in);
		System.out.println("Enter the String2: ");
		String s2 = scan2.next();
		
		scan2.close();
		
		String s3 = scan2.next();
	}
}

java.lang.IllegalStateException: Scanner closed 발생 → ⭐ 입력을 모두 마친 후, scan.close() 작성

 

 

 

➕ Scanner class 객체 생성을 main() 내부가 아닌 class에 직접 생성할 경우, Resource Leakage 발생 X

package basic;

import java.util.*;

class AvoidLeakage2{
	Scanner scan = new Scanner(System.in);

	public void printS() {
		System.out.println("Enter the String: ");
		String s = scan.next();
	}
}

 

참고 자료

📑 자바 sc.close();

 

 

'Java > Java with Error' 카테고리의 다른 글

[해결 방법] java.lang.Error  (0) 2023.02.16
[해결 방법] java.lang.Error  (0) 2023.02.13
[해결 방법] java.lang.Error  (0) 2023.02.12
[해결 방법] java.lang.Error  (0) 2023.02.11
[해결 방법] java.lang.NullPointerException  (0) 2023.02.11