使用try-with-resources围绕扫描仪

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用try-with-resources围绕扫描仪相关的知识,希望对你有一定的参考价值。

我已经创建了一个算法来读取文件并检查用户输入的多个问题。我正在使用Netbeans,它建议尝试使用资源。我不确定的是关闭文件。当我第一次创建算法时,我将file.close()放在错误的位置,因为无法访问它,因为它之前有一个“return”语句:

while (inputFile.hasNext()) 
        String word = inputFile.nextLine();
        for (int i = 0; i < sentance.length; i++) 
            for (int j = 0; j < punc.length; j++) 
                if (sentance[i].equalsIgnoreCase(word + punc[j])) 

                    return "I am a newborn. Not even a year old yet.";
                
            
        
    
    inputFile.close(); // Problem

所以我用这个修好了:

        File file = new File("src/res/AgeQs.dat");
    Scanner inputFile = new Scanner(file);
    while (inputFile.hasNext()) 
        String word = inputFile.nextLine();
        for (int i = 0; i < sentance.length; i++) 
            for (int j = 0; j < punc.length; j++) 
                if (sentance[i].equalsIgnoreCase(word + punc[j])) 
                    inputFile.close(); // Problem fixed
                    return "I am a newborn. Not even a year old yet.";
                
            
          
    

问题是,当我以错误的方式设置时,Netbeans建议:

        File file = new File("src/res/AgeQs.dat");
    try (Scanner inputFile = new Scanner(file)) 
        while (inputFile.hasNext()) 
            String word = inputFile.nextLine();
            for (int i = 0; i < sentance.length; i++) 
                for (int j = 0; j < punc.length; j++) 
                    if (sentance[i].equalsIgnoreCase(word + punc[j])) 

                        return "I am a newborn. Not even a year old yet.";
                    
                
              
        
    

是Netbeans纠正我的代码,还是只是删除文件的关闭?这是一个更好的方法吗?除非我确切地知道发生了什么,否则我不喜欢使用代码。

答案

try-with-resources可以保证AutoCloseable资源(如Scanner)始终处于关闭状态。关闭是由javac about隐式添加的。如

Scanner inputFile = new Scanner(file);
try 
    while (inputFile.hasNext()) 
        ....
    
 finally 
    inputFile.close();

顺便说一句,Netbeans没有注意到你的代码存在问题。扫描程序的方法不会抛出IOException但会抑制它。使用Scanner.ioException检查读取文件期间是否发生任何异常。

另一答案

阅读this,Java 7的try-with-resource块。

try-with-resources语句确保在语句结束时关闭每个资源。

Java 6不支持try-with-resources;您必须显式关闭IO流。

另一答案

是Netbeans纠正我的代码,还是只是删除文件的关闭?

它正在纠正你的代码。 try-with-resource具有隐式finally子句,用于关闭在资源部分中声明/创建的资源。 (所有资源必须实现Closeable接口...)

以上是关于使用try-with-resources围绕扫描仪的主要内容,如果未能解决你的问题,请参考以下文章

Android UIPaint Gradient 渐变渲染 ② ( SweepGradient 梯度渐变渲染 | 围绕中心点绘制扫描渐变的着色器 | 多渐变色构造函数 | 雷达扫描效果 )

在 Netbeans 中使用 try-with-resources

使用try-with-resource优雅关闭资源

为啥 try-with-resources 不能与字段变量一起使用?

使用 try-with-resources 重写此代码

如果我们使用 try-with-resource 是不是需要关闭资源