当前位置: 首页 > 知识库问答 >
问题:

资源泄漏'空白'从未关闭

祝灼光
2023-03-14

当我创建扫描仪时,似乎出现了这个错误。我试图通过搜索错误名称来解决这个问题,但到目前为止未能成功地让消息停止出现。

代码:

import java.util.Scanner;
public class PrintQueue {
    //Instance variables
    private Queue<Job> pq;
    //Constructor
    public PrintQueue() {
        pq = new Queue<Job>();
    }
    //Adds a job object to the end of the queue
    public void lpr(String owner, int jobId) {
        Job j = new Job(owner, jobId);
        pq.enqueue(j);
    }
    //Enumerates the queue
    public void lpq() {
        Job curr = pq.first();
        for (int i = 0; i < pq.size(); i++) {
            System.out.println(curr);
            curr = pq.next();
        }
    }
    //Removes the first entry in the queue if the input integer matches the integer contained within the job object
    public void lprm(int jobId) {
        if (pq.first().getJobId() == (jobId))
            pq.dequeue();
        else 
            System.out.println("Unable to find jobId.");
    }
    //Removes all objects that contain the input String
    public void lprmAll(String owner) {
        Job curr = pq.first();
        for (int i = 0; i < pq.size(); i++) {
            if (curr.getOwner().equals(owner)) 
                pq.dequeue();
            curr = pq.next();
        }
    }
    //Demo 
    public static void main(String[] args) {
        Scanner k = new Scanner(System.in);
        PrintQueue myPQ = new PrintQueue();
        String name;
        int id;
        for (int i = 1; i <= 5; i++) {
            System.out.print("Enter owner and id: ");
            name = k.next();
            id = k.nextInt();
            myPQ.lpr(name, id);
        }
        System.out.println("Print Queue");
        myPQ.lpq();
        myPQ.lprm(101);
        myPQ.lprmAll("ronaldinho");
        System.out.println("Print Queue"); 
        System.out.println("\n\n"); 
        myPQ.lpq(); 
    }
}

我得到错误的部分:

Scanner k = new Scanner(System.in);

共有2个答案

贺玉石
2023-03-14

这似乎是警告而不是错误。然而,解决这个问题是一个很好的做法。

实际上你只需要调用k.close() 方法的末尾。最佳实践是在finally块中调用close:这保证了无论是否引发异常,资源都是关闭的;

Scanner k = null;
try {
    k = new Scanner(System.in);
    ........
} finally {
    if (k != null) {
        k.close();
    }
}

幸运的是,java 7提供的语法不那么冗长:

try (
    Scanner k = new Scanner(System.in);
) {
    .... // use k
} 

当实现了Closable的任何类的对象在try块的特殊部分中创建时,用常规括号()标记,您不必编写最后的块:它是由编译器添加的。

陈斌蔚
2023-03-14

那是因为你永远不会关闭扫描仪。将代码更改为:

Scanner k = null;
try {
    k = new Scanner(System.in);
    //do stuff with k here...
} finally {
    if( k != null )
        k.close();
}
 类似资料:
  • 为什么Eclipse在下面的代码中给了我变暖的“资源泄漏:'in'从不关闭”?

  • 此代码导致资源泄漏: conin从未关闭 为什么会发生这种情况?我如何修复它?

  • 我正在使用Eclipse,并执行下面的函数,碰巧我打开了一个扫描器,然后,最后我关闭了它,但Eclipse一直说它没有关闭“资源泄漏:'Scanner'没有关闭”。我可以用try with resources来完成,警告消失了,但我想知道为什么我在这里尝试的方式不起作用

  • 问题内容: 在spring MVC应用程序中,我使用以下方法在服务类之一中初始化变量: UserLibrary是我在应用程序中使用的第三方工具。上面的代码为’context’变量生成警告。该警告如下所示: 我不明白警告。由于该应用程序是Spring MVC应用程序,因此在运行该应用程序时,我无法真正关闭/销毁上下文,因为我引用该服务。警告到底想告诉我什么? 问题答案: 由于应用程序上下文是一个(i

  • 我正在编写一个程序,希望控制台输出用户输入的数字的剩余部分。但是,每次我编译代码时,控制台都会打印出来,我得到以下控制台错误: 我不确定控制台所说的“资源泄漏”是什么意思。我在几个不同的地方查找过它(包括API和其他堆栈溢出问题),我不确定为什么没有打印到控制台。我正在使用DrJava程序,以防有人想知道。 这里是我的代码供参考:

  • 在Spring MVC应用程序中,我使用以下方法初始化一个服务类中的变量: UserLibrary是我在应用程序中使用的第三方实用程序。上面的代码为“context”变量生成警告。警告如下所示: 我不明白这个警告。由于应用程序是一个Spring MVC应用程序,当我在应用程序运行时引用服务时,我不能真正关闭/破坏上下文。警告到底想告诉我什么?