资源泄漏:此位置'in'未关闭



我只希望某人查看我的代码并建议将其改进为写得很好的Java代码。我正在做的是使用扫描仪获得用户输入,直到用户输入数量为0-10。

int Ai = getInput("i", "A");
int Aj = getInput("j", "A");
int Bi = getInput("i", "B");
int Bj = getInput("j", "B");
private static int getInput(String axis, String point) {
    int coordinate = 0;
    boolean valid = false;
    while(!valid){
        Scanner in = new Scanner(System.in);
        System.out.println("Enter "+ axis +" for " + point +" > ");
        if (in.hasNextInt()){
            coordinate = in.nextInt();
            if (coordinate >= 0 && coordinate <10){
                valid = true;
                return coordinate;
            }
        }
    }
    return coordinate; 
}

,但我在第11行(返回坐标)中收到警告"资源泄漏:'in"在此位置没有关闭;

您不必每次运行循环时都要实例化Scanner对象in。因此,将Scanner in = new Scanner(System.in);放置在while环上。

您不需要return内部的CC_5。因为valid = true内部if块,该块在while中评估false的条件中断,从而突破了循环。

而是使用此代码:

private static int getInput(String axis, String point) {
int coordinate = 0;
boolean valid = false;
Scanner in = new Scanner(System.in);
while(!valid)
{
    if (in.hasNextInt()){
        coordinate = in.nextInt();
        if (coordinate >= 0 && coordinate <10){
        valid = true;
        }
    }
}
in.close();
return coordinate;
}

每当您以任何语言(其中大多数)打开代码中的外部资源(I/O)时,您都必须关闭该外部资源。

始终您必须关闭与I/O结束后与I/O的课程实例。

在这里,外部资源是System.in,您已经打开它以获取输入,但是在工作后,您没有关闭该资源。这就是为什么它要求您关闭它。

如果您关闭扫描仪in.close(),则不能使用in下次获取输入,除非您再次实例化。

在两个return语句上方添加in.close(),并且应该没有错误。


编辑:

问题是我们正在关闭Scanner中的CC_16,该评论中的"亨利"也关闭了System.in

因此将其声明为static,并在main()末尾关闭Scanner

代码:

import java.util.Scanner;
public class Main{
    static Scanner in = new Scanner(System.in); //Declared as Static
    private static int getInput(String axis, String point) {
        int coordinate = 0;
        boolean valid = false;
        while(!valid)
        {
            System.out.println("Enter "+ axis +" for " + point +" > ");
            if (in.hasNextInt()){
                coordinate = in.nextInt();
                if (coordinate >= 0 && coordinate <10){
                valid = true;
                }
            }
        }
        return coordinate;
        }
public static void main(String[] args) throws Exception 
{
    int Ai = getInput("i", "A");
    int Aj = getInput("j", "A"); 
    int Bi = getInput("i", "B");
    int Bj = getInput("j", "B");
    in.close(); // close the scanner when your program is about to end
}
}

在处理单行中的多个输入时

您应该使用代码的附加行

String[] in= lines.trim().split("\s+");
for (int i = 0; i < 2; i++) {
a[i] = Integer.parseInt(in[i]);
}

您可能不知道用户是否按照此顺序输入数据[较早]无法解析,从而导致该功能无法正常采取行动。

相关内容

最新更新