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