为何Eclipse提示“Resource leak: 'in' is never closed”资源泄漏警告?
为何调用了Scanner.close()仍被Eclipse提示资源泄漏?
Eclipse的静态代码分析工具会检查资源是否在所有可能的执行路径下都能被关闭,你的代码里存在触发异常导致in.close()无法执行的情况:
- 当执行
in.nextInt()时,如果用户输入的不是整数(比如字母、符号),会抛出InputMismatchException,程序会直接终止,后续的in.close()根本没机会运行。 - 虽然你写了关闭代码,但它不是在所有场景下都能触发,静态分析会识别这种潜在的资源泄漏风险,因此给出警告。
解决方法
方法1:使用try-with-resources(推荐)
Java 7及以上支持的语法,资源会在try块结束后自动关闭,无论是否发生异常:
import java.util.*; public class EvenNumberSum{ public static void main(String args[]) { int N, i, sum = 0; try (Scanner in = new Scanner(System.in)) { System.out.println("Enter a number"); N = in.nextInt(); for(i = 0; i <= N; i++){ if((i%2) == 1){ sum += i; } } System.out.print ("Sum of all odd numbers between 0 to " + N + " = " + sum); } } }
方法2:用try-finally块包裹
将关闭操作放到finally块中,确保无论是否发生异常,资源都会被关闭:
import java.util.*; public class EvenNumberSum{ public static void main(String args[]) { int N, i, sum = 0; Scanner in = new Scanner(System.in); try { System.out.println("Enter a number"); N = in.nextInt(); for(i = 0; i <= N; i++){ if((i%2) == 1){ sum += i; } } System.out.print ("Sum of all odd numbers between 0 to " + N + " = " + sum); } finally { in.close(); } } }
内容的提问来源于stack exchange,提问作者Nurmeirasari
相关产品推荐
相关产品推荐

