资源泄漏:此处未关闭“输入”

时间:2017-03-15 04:45:59

标签: java java.util.scanner

我只是希望有人审核我的代码和建议,以便将其改进为一个编写良好的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行(返回坐标;)请有人解释我这个

2 个答案:

答案 0 :(得分:2)

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

return阻止内部if不需要valid = true。因为if内部的false阻止了while内部的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; } 条件,它会突破循环。

请改用此代码:

System.in

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

总是你必须在完成后关闭处理I / O的类的实例。

此外部资源为in.close(),您已打开它以接收输入,但在您工作后您没有关闭该资源。这就是为什么要求你关闭它。

如果您关闭扫描仪in,则下次无法使用in.close()获取输入,除非您通过实例化再次打开它。

return语句上方添加Scanner,不应出错。

修改

问题是我们正在getinput()关闭System.instatic也在关闭Scanner,正如评论中“Henry”所说的那样。

因此请将其声明为main()并关闭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 } } 末尾的private FileAppender appender = new FileAppender(); log.addAppender(appender);

<强>代码:

private ValueMember AddField(int fieldNumber, string memberName, Type itemType, Type defaultType, object defaultValue)

答案 1 :(得分:-1)

在一行中处理多个输入时

您应该使用以下行添加到您的代码

String[] in= lines.trim().split("\\s+");

for (int i = 0; i < 2; i++) {
a[i] = Integer.parseInt(in[i]);
}

您可能不知道用户是否按此顺序输入数据,程序[之前]将无法解析它导致该功能无法正常运行。