我的Java程序似乎正在跳过尝试{},执行catch {},然后抛出NullpoInterException.我应该怎么



我正在编写一个程序,该程序在任何给定的文本文件中计算单词,音节和句子的数量。我不需要找到这些数字的帮助,但是我的程序(当前只能在文本文件中找到单词数),即使我正确键入文件的名称,也不会导入文本文件。文本文件与源代码在同一文件夹中。取而代之的是,它每次我输入的内容都会告诉我错误的文件扩展名(请参阅我的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);
    }
}

您的捕获集集scan = null,然后在下一行(外部捕获)上使用scan.hasNext()-如果您经过捕获量,您知道扫描是无效的,因此这将为您提供NullPoInterException。

您可能应该重新恢复异常或使代码足够强大以应对无效扫描仪(即什么都不做)

尝试这个...

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

查看Scanner初始化的问题。

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

如果源文件在C: src

c:

cd C: src

Java Reading_lvl_calc

用均等()替换操作员以进行比较:

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

上面的情况下,我们可以验证扫描OBJ是否为null,然后迭代扫描OBJ .....

if(scan != null){
    while(scan.hasNext()){
        words++;
        scan.next();
    }
}

使用'=='和'!='对象上的操作员(例如字符串)通常是一个坏主意,因为对象变量的实际值是内存地址,对象是因此,通过参考进行比较,在您的情况下,这不是所需的效果:您不在乎filename.substring(filename.indexof("。"))和" .txt"在内存中共享相同的位置(他们不会)。使用.equals()代替按值进行比较。否则测试将始终返回false,如果语句毫无用处。

我在这里同意Valekhalfhart,并在检查它后告诉您以下代码,我认为将处理"无效的文件扩展名"问题。

更改

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

to

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

这应该做

当扫描仪创建失败时,无需执行任何与扫描仪相关的事情,因此您应该将所有扫描仪代码放入try block和catch Block中的一些错误消息。在进行扫描仪创建之前,应进行文件名检查。

    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());
    }

相关内容

最新更新