programing

리소스 누출: 'in'이 닫히지 않음

copysource 2022. 9. 29. 23:37
반응형

리소스 누출: 'in'이 닫히지 않음

왜 이클립스는 다음 코드로 "리소스 누출: 'in'은 닫히지 않는다"라는 따뜻한 메시지를 내게 주는 걸까?

public void readShapeData() {
        Scanner in = new Scanner(System.in);
        System.out.println("Enter the width of the Rectangle: ");
        width = in.nextDouble();
        System.out.println("Enter the height of the Rectangle: ");
        height = in.nextDouble();

스캐너를 닫지 않기 때문에

in.close();

다른 사용자가 말했듯이 IO 클래스는 '닫기'를 호출해야 합니다.여기에 트라이를 사용하기에 최적의 장소라고 덧붙이겠습니다.마지막으로 다음과 같이 캐치가 없는 블록입니다.

public void readShapeData() throws IOException {
    Scanner in = new Scanner(System.in);
    try {
        System.out.println("Enter the width of the Rectangle: ");
        width = in.nextDouble();
        System.out.println("Enter the height of the Rectangle: ");
        height = in.nextDouble();
    } finally {
        in.close();
    }
}

이렇게 하면 스캐너가 항상 닫혀 올바른 리소스 정리가 보장됩니다.

마찬가지로 Java 7 이상에서는 "리소스와 함께 시도" 구문을 사용할 수 있습니다.

try (Scanner in = new Scanner(System.in)) {
    ... 
}

전화해야 합니다.in.close(), a에서finally차단합니다.

Eclipse 문서에서 이 특정 문제에 플래그를 붙이는 이유는 다음과 같습니다(강조).

인터페이스 java.io 를 실장하고 있는 클래스.닫힘(JDK 1.5 이후) 및 java.lang.AutoCloseable(JDK 1.7 이후)은 외부 리소스를 나타내는 것으로 간주되며, 더 이상 필요하지 않은 경우 메서드 close()를 사용하여 리소스를 닫아야 합니다.

Eclipse Java 컴파일러는 이러한 유형을 사용하는 코드가 이 정책을 준수하는지 여부를 분석할 수 있습니다.

...

컴파일러는 [violations]에 "Resource leak: 'stream' is never closed" 플래그를 붙입니다.

자세한 설명은 이쪽입니다.

인스턴스화한 스캐너를 닫아야 합니다.System.in와 함께Scanner.close()보통 모든 리더는 닫아야 합니다.

를 닫는 경우 주의해 주세요.System.in다시 읽을 수 없게 됩니다.여러분은 또한 수업을 볼 수 있습니다.

public void readShapeData() {
    Console console = System.console();
    double width = Double.parseDouble(console.readLine("Enter the width of the Rectangle: "));
    double height = Double.parseDouble(console.readLine("Enter the height of the Rectangle: "));
    ...
}
// An InputStream which is typically connected to keyboard input of console programs

Scanner in= new Scanner(System.in);

위의 행은 인수 System.in을 사용하여 스캐너 클래스의 컨스트럭터를 호출하고 새로 생성된 객체에 대한 참조를 반환합니다.

키보드에 연결된 입력 스트림에 연결되어 있으므로 런타임에 사용자 입력을 받아 필요한 작업을 수행할 수 있습니다.

//Write piece of code 

메모리 누출을 제거하려면 -

in.close();//write at end of code.

JDK7 또는 8을 사용하는 경우 리소스가 포함된 트라이캐치를 사용할 수 있습니다.그러면 스캐너가 자동으로 닫힙니다.

try ( Scanner scanner = new Scanner(System.in); )
  {
    System.out.println("Enter the width of the Rectangle: ");
    width = scanner.nextDouble();
    System.out.println("Enter the height of the Rectangle: ");
    height = scanner.nextDouble();
  }
catch(Exception ex)
{
    //exception handling...do something (e.g., print the error message)
    ex.printStackTrace();
}

추가private static Scanner in;는 문제를 해결하지 않고 경고만 지웁니다.스캐너를 정적 상태로 만든다는 것은 스캐너가 영원히 열려 있다는 것을 의미합니다(또는 클래스가 "영원히" 언로드될 때까지).컴파일러는 당신이 그에게 "영원히 열어두라"고 말했기 때문에 더 이상 경고를 주지 않습니다.그러나 더 이상 필요하지 않게 되면 리소스를 즉시 닫아야 하기 때문에 이 작업은 실제로 수행하려고 했던 것이 아닙니다.

HTH, 맨프레드

좋아요, 정말이에요, 적어도 많은 경우 이건 사실 버그에요.VS 코드에도 표시됩니다.스캐너 개체를 닫지 않고 동봉 범위의 끝에 도달한 것을 린터가 인식하지만 열려 있는 파일 기술자를 모두 닫는 것은 프로세스 종료의 일부라는 것을 인식하지 못합니다.종료 시 리소스가 모두 청소되고 프로세스가 중단되어 리소스를 보관할 곳이 없기 때문에 리소스 누수가 발생하지 않습니다.

스캐너를 닫으면 스캐너를 닫아야 합니다.

in.close();

일반적으로 I/O를 처리하는 클래스의 인스턴스는 작업이 끝나면 닫아야 합니다.에 '아까보다'를 붙일 수 요.in.close().

스캐너를 닫아야 합니다.독자, 스트림...을 닫는 것이 좋습니다.이러한 종류의 오브젝트는 자원과 메모리 누수를 해방합니다.또한 이러한 오브젝트를 처리하는 동안 예외가 발생하더라도 확실하게 닫힙니다.

private static Scanner in;

개인 정적 스캐너 클래스 변수로 선언하여 수정했습니다.그게 왜 그걸 고쳤는지는 모르겠지만 일식이 나에게 그렇게 하라고 권한 거야.

Scanner sc = new Scanner(System.in);

//do stuff with sc

sc.close();//write at end of code.
in.close();
scannerObject.close(); 

Scanner경고를 종료합니다.

언급URL : https://stackoverflow.com/questions/12519335/resource-leak-in-is-never-closed

반응형