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.