2

我正在编写一个程序来计算任何给定文本文件中的单词、音节和句子的数量。我不需要帮助来查找这些数字,但是即使我正确输入了文件名,我的程序(目前只能查找文本文件中的字数)也不会导入文本文件。文本文件与源代码位于同一文件夹中。相反,它每次都告诉我我输入的文件扩展名错误(请参阅我的 catch{}),然后继续抛出一个空指针。我不知道是什么原因造成的。有什么建议么?

import java.io.*;
import java.util.*;

public class Reading_Lvl_Calc {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int words = 0;
        String fileName;
        Scanner scan;
        Scanner keyread = new Scanner(System.in);
        System.out.println("Please enter a file name (or QUIT to exit)");
        fileName = keyread.nextLine();
        File doc = new File(fileName);
        //while(scan.equals(null)){
        try
        {   
            scan = new Scanner(doc);
        }
        catch(Exception e)
        {   
            if(fileName.substring(fileName.indexOf(".")) != ".txt")
            System.out.println("I'm sorry, the file \"" + fileName + "\" has an invalid file extension.");
            else 
            System.out.println("I am sorry, the file \"" + fileName + " \" cannot be found.\n The file must be in the same directory as this program");
            scan = null;
        }
    //  }
        while(scan.hasNext()){
            words++;
            scan.next();
        }
        System.out.println(words);

    }

}
4

7 回答 7

4

你的 catch 设置scan = null,然后在下一行(在 catch 之外)使用scan.hasNext()- 如果你通过 catch 你知道 scan 是空的,所以这会给你一个 NullPointerException。

您可能应该重新抛出异常或使代码足够健壮以应对空扫描仪(即什么也不做)

于 2012-11-03T04:22:27.517 回答
1

试试这个...

try{   
    scan = new Scanner(doc);
}catch(Exception e){   
    e.printStackTrace();
}

看看Scanner初始化有什么问题。

于 2012-11-03T04:56:40.103 回答
1

如果您从命令行运行,请将目录更改为源文件所在的文件夹。(我假设类文件和 txt 文件也在同一个目录中)

如果源文件在 c:\src

C:

cd c:\src

java Reading_Lvl_Calc

于 2012-11-03T09:03:49.303 回答
1

将运算符替换为 equal() 进行比较:

        if(fileName.substring(fileName.indexOf(".")) != ".txt")
    to
        if((fileName.substring(fileName.indexOf("."))).equals(".txt"))  

以上while条件我们可以验证scan obj是否为null,然后迭代scan obj.....

if(scan != null){
    while(scan.hasNext()){
        words++;
        scan.next();
    }
}
于 2012-11-03T11:48:15.440 回答
0

在对象(例如字符串)上使用 '==' 和 '!=' 运算符通常是一个坏主意,因为对象变量的实际值是内存地址,因此对象通过引用进行比较,在您的情况下不是预期的效果:您不在乎 fileName.substring(fileName.indexOf(".")) 和 ".txt" 是否在内存中共享相同的位置(它们不会)。使用 .equals() 代替按值进行比较。否则测试将始终返回 false 并且您的 if 语句是无用的。

于 2012-11-03T05:22:35.397 回答
0

我同意 ValekHalfHart 的观点,并在我检查后告诉你,我认为以下代码将处理“文件扩展名无效”问题。

更改

if(fileName.substring(fileName.indexOf(".")) != ".txt")

if(!fileName.substring(fileName.indexOf(".").equals(".txt"))

这应该这样做

于 2012-11-03T05:57:47.010 回答
0

当扫描仪创建失败时,没有必要做任何与扫描仪相关的事情,因此您应该将所有扫描仪代码放入 try 块中,并将一些错误消息放入 catch 块中。在继续创建扫描仪之前,应检查文件名。

    try
    {   
        scan = new Scanner(doc);
        while(scan.hasNext())
        {
            words++;
            scan.next();
        }
        System.out.println(words);
    }
    catch(Exception e)
    {
        System.out.println("Scanner creation failure:" + e.getMessage());
    }
于 2012-11-03T12:15:42.280 回答