使用 Scanner 在许多地方 Java 泄漏资源

Resource leaked in many places Java using Scanner

在过去的 42 分钟里,我一直在努力找出错误的原因

Resource leaked: 'myFirstname' and many other decleared variables including myObj when its ran.

你只需要一个Scanner警告 是因为您从未关闭 Scanner。通常这是一个有价值的警告,但是当 Scanner 包裹 System.in 关闭时它也会关闭 System.in 所以通常你不会关闭这样的 Scanner。但是,您可以在程序结束之前这样做;最简单的方法是 try-with-Resources。此外,您将扫描仪 myUsernameString newUsername 进行比较,并关闭 if body 和不幸放置的 ;。修复所有这些,它应该看起来像

try (Scanner scan = new Scanner(System.in)) {
    System.out.println("Enter your First Name");
    String firstName = scan.nextLine();

    System.out.println("Enter your Last Name");

    String lastName = scan.nextLine();

    System.out.println("Enter your Year of Employment");

    String yearVar = scan.nextLine();

    String newUsername = firstName.substring(0, 1) + lastName;
    System.out.println("Username: " + newUsername);

    String newPassword = firstName.substring(0, 3) + yearVar + lastName.substring(0, 3);
    System.out.println("Password: " + newPassword);

    System.out.println("Enter your Username");
    String userName = scan.nextLine();

    System.out.println("Enter your Password");
    String passWord = scan.nextLine();

    if (userName.equals(newUsername)) {
        System.out.println("Would you like to change your password?");
    }
}

您正在创建大量 Scanner 对象,并关闭了其中的 none 个。这导致资源泄漏。要关闭它们并停止泄漏,请在完成后添加:myScanner.close()

此外,最好使用较少的扫描器对象并重用一个以优化您的代码。

编辑:正如 Elliott Frisch 的回答所指出的,关闭扫描仪包装 System.in 也会关闭它,这通常是不需要的。