BufferedReader读取一个以某种方式为null的值

时间:2014-08-12 14:17:23

标签: java nullpointerexception

好的,所以我正在做一个有配置文件处理程序的程序,它的作用是从文本文件读取行,看起来像这样:

ImagePath=SomePath

该方法逐行读取匹配键和相应行的行,然后搜索&#39; =&#39;字符串中的字符位置,然后对其进行子串,以便获得值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; 
} 

2 个答案:

答案 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课程,这会让事情变得更容易。