好的,所以我正在做一个有配置文件处理程序的程序,它的作用是从文本文件读取行,看起来像这样:
ImagePath=SomePath
该方法逐行读取匹配键和相应行的行,然后搜索' ='字符串中的字符位置,然后对其进行子串,以便获得值SomePath
。但是,有一个问题。
基本上,我面临的问题是读者能够读取文件,因为我发表了一个声明来打印lines
变量,它确实打印出读取行。但是,问题是这个lines
变量会被操纵,但是那里会发生NullPointerException错误(lines.substring(0,key.length()-1)
部分),这表明lines
变量突然< / em>变为null
,即使它显示某些内容已被读入变量。事实是,print语句和字符串操作之间的这个变量会发生什么?我无法解决这个问题。原谅我的代码可能看起来很乱或什么。我正在尝试使用我的代码的多种变体来尝试缓解这个问题,但它似乎无法正常工作。下面显示的是我最新的代码变体。
public static String readConfig(String key) throws IOException
{
BufferedReader reader=null;
try
{
reader=new BufferedReader(new FileReader(config));
}
catch(FileNotFoundException e)
{
System.out.println("Failed to read file. Code: 3");
System.exit(0);
}
String lines=reader.readLine();
System.out.println(lines);
String returnValue=null;
while(true)
{
if(key.equals(lines.substring(0,key.length()-1)))
{
int plusPos=0;
for(int i=0;i<lines.length();i++)
{
if(lines.charAt(i)=='=')
{
plusPos=i;
}
}
if(plusPos==0)
{
reader.close();
return null;
}
returnValue=lines.substring(plusPos,lines.length()-1);
reader.close();
return returnValue;
}
lines=reader.readLine();
}
}
编辑1:好的,我看到Sbodd建议我的代码有点瑕疵,但是,上面的代码片段只是一个调试的实例,并且测试该行变量突然读取null的循环的哪个部分。这是我的原始代码段:
public static String readConfig(String key) throws IOException
{
BufferedReader reader=null;
try
{
reader=new BufferedReader(new FileReader(config));
}
catch(FileNotFoundException e)
{
System.out.println("Failed to read file. Code: 3");
System.exit(0);
}
String line;
String returnValue;
while((line=reader.readLine())!=null)
{
line=line.trim();
if(key.equals(line.substring(0,key.length()-1)))
{
int plusPos=0;
for(int i=0;i<line.length();i++)
{
if(line.charAt(i)=='=')
{
plusPos=i;
}
}
if(plusPos==0)
{
return null;
}
returnValue=line.substring(plusPos,line.length()-1);
return returnValue;
}
}
return null;
}
答案 0 :(得分:2)
当代码到达文件末尾时,它总是会抛出NPE。
来自the documentation for BufferedReader: [readLine returns]一个String,包含该行的内容,不包括任何行终止字符;如果已到达流的末尾,则为null。
因为您的代码是:
lines = reader.readLine();
while (true) {
//do stuff with lines
lines=reader.readLine();
}
当您到达文件结尾时,reader.readLine
将返回null,您仍然会通过while
检查(因为“true”始终为true),然后您将尝试使用那个空指针。
您只需将while(true)
替换为while (lines != null)
。
这样做的典型模式是
while ((lines = reader.readLine()) != null) {
//do stuff with lines
}
(注意,在这里,你不会在while循环之外第一次调用readLine,因为你的条件将在第一次执行循环之前进行测试。)
答案 1 :(得分:1)
您的字符串比较将始终失败。
if(key.equals(lines.substring(0,key.length()-1)))
将尝试匹配&#34; ImagePat&#34;和#34; ImagePath&#34;,这将失败。这将导致循环的第二次迭代,lines
现在等于null。
您的比较应该是:
if (key.equals(lines.substring(0, key.length())))
此外,您的返回值应为
returnValue = lines.substring(plusPos + 1, lines.length());
正确返回值。
您还应该查看Properties
课程,这会让事情变得更容易。