[java] 리소스 누출 : ‘in’은 닫히지 않습니다.

Eclipse가 다음 코드에서 “Resource leak : ‘in’is never closed”라는 온난화를주는 이유는 무엇입니까?

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 클래스에서 ‘close’를 호출해야합니다. 다음과 같이 try-finally 블록을 캐치없이 사용할 수있는 훌륭한 장소라고 추가하겠습니다.

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-with-resources”구문을 사용할 수 있습니다.

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


답변

그것이 발생하는지 확인하기 위해 블록 in.close()에서 호출해야 finally합니다.

이클립스 문서에서, 여기에 그 깃발이 특정 문제 ( 강조 광산) :

인터페이스 java.io.Closeable (JDK 1.5 이후) 및 java.lang.AutoCloseable (JDK 1.7 이후 )을 구현하는 클래스 는 더 이상 필요하지 않을 때 close () 메소드를 사용하여 닫아야하는 외부 자원을 나타내는 것으로 간주됩니다.

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

컴파일러는 “Resource leak : ‘stream’is never closed”로 [위반] 플래그를 지정합니다.

여기에 자세한 설명이 있습니다 .


답변

를 사용하여 인스턴스화 한 스캐너를 닫아야한다는 메시지 System.in입니다 Scanner.close(). 일반적으로 모든 독자는 닫혀 있어야합니다.

을 닫으면 System.in다시 읽을 수 없습니다. Console수업을 살펴볼 수도 있습니다 .

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: "));
    ...
}


답변

JDK7 또는 8을 사용하는 경우 리소스와 함께 try-catch를 사용할 수 있습니다. 그러면 자동으로 스캐너가 닫힙니다.

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();
}


답변

// An InputStream which is typically connected to keyboard input of console programs

Scanner in= new Scanner(System.in);

위의 줄은 System.in 인수를 사용하여 Scanner 클래스의 생성자를 호출하고 새로 생성 된 개체에 대한 참조를 반환합니다.

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

//Write piece of code 

메모리 누수를 제거하려면-

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


답변

당신은해야 닫고 당신이 그것을 완료하면 스캐너를 :

in.close();