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

Java BufferedReader读取一个以某种方式为空的值,java,nullpointerexception,Java,Nullpointerexception,好的,我在做一个程序,它有一个配置文件处理程序,它所做的是从一个文本文件中读取行,看起来像这样: ImagePath=SomePath 该方法逐行读取与键匹配的对应行,然后在字符串中搜索“=”字符位置,然后对其进行子串,从而获得值SomePath。然而,有一个问题。 基本上,我面临的问题是,当我输入一条语句来打印行变量时,读取器能够读取该文件,并且它确实打印出读取的行。但是,问题是该行变量随后会被操作,但在该变量周围会发生NullPointerException错误(行.substring(0

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

ImagePath=SomePath
该方法逐行读取与键匹配的对应行,然后在字符串中搜索“=”字符位置,然后对其进行子串,从而获得值
SomePath
。然而,有一个问题。 基本上,我面临的问题是,当我输入一条语句来打印
变量时,读取器能够读取该文件,并且它确实打印出读取的行。但是,问题是该
变量随后会被操作,但在该变量周围会发生NullPointerException错误(
行.substring(0,key.length()-1)
部分),表明
变量突然变为
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();
    } 
} 
公共静态字符串readConfig(字符串键)引发IOException
{
BufferedReader reader=null;
尝试
{ 
reader=newbufferedreader(newfilereader(config));
} 
catch(filenotfounde异常)
{ 
System.out.println(“读取文件失败。代码:3”);
系统出口(0);
} 
字符串行=reader.readLine();
系统输出打印项次(行);
字符串returnValue=null;
while(true)
{ 
if(key.equals(lines.substring(0,key.length()-1)))
{ 
int-plusPos=0;

对于(inti=0;i您的代码在到达文件末尾时将始终抛出NPE

发件人: [readLine returns]一个包含行内容的字符串,不包括任何行终止字符,如果已到达流的结尾,则返回null

因为您的代码是:

lines = reader.readLine();
while (true) {
  //do stuff with lines
  lines=reader.readLine();
}
当您到达文件末尾时,
reader.readLine
将返回null,您仍将通过
的while
检查(因为“true”始终为true),然后您将尝试使用该null指针

您可以将
while(true)
替换为
while(lines!=null)

这样做的典型模式是

while ((lines = reader.readLine()) != null) {
  //do stuff with lines
}

(注意,在这里,您不会在while循环之外对readLine进行第一次调用,因为您的条件将在第一次执行循环之前进行测试。)

您的代码在到达文件末尾时始终会抛出NPE

发件人: [readLine returns]一个包含行内容的字符串,不包括任何行终止字符,如果已到达流的结尾,则返回null

因为您的代码是:

lines = reader.readLine();
while (true) {
  //do stuff with lines
  lines=reader.readLine();
}
当您到达文件末尾时,
reader.readLine
将返回null,您仍将通过
的while
检查(因为“true”始终为true),然后您将尝试使用该null指针

您可以将
while(true)
替换为
while(lines!=null)

这样做的典型模式是

while ((lines = reader.readLine()) != null) {
  //do stuff with lines
}

(注意,在这里,您不会在while循环之外对readLine进行第一次调用,因为您的条件将在第一次执行循环之前进行测试。)

您的代码在到达文件末尾时始终会抛出NPE

发件人: [readLine returns]一个包含行内容的字符串,不包括任何行终止字符,如果已到达流的结尾,则返回null

因为您的代码是:

lines = reader.readLine();
while (true) {
  //do stuff with lines
  lines=reader.readLine();
}
当您到达文件末尾时,
reader.readLine
将返回null,您仍将通过
的while
检查(因为“true”始终为true),然后您将尝试使用该null指针

您可以将
while(true)
替换为
while(lines!=null)

这样做的典型模式是

while ((lines = reader.readLine()) != null) {
  //do stuff with lines
}

(注意,在这里,您不会在while循环之外对readLine进行第一次调用,因为您的条件将在第一次执行循环之前进行测试。)

您的代码在到达文件末尾时始终会抛出NPE

发件人: [readLine returns]一个包含行内容的字符串,不包括任何行终止字符,如果已到达流的结尾,则返回null

因为您的代码是:

lines = reader.readLine();
while (true) {
  //do stuff with lines
  lines=reader.readLine();
}
当您到达文件末尾时,
reader.readLine
将返回null,您仍将通过
的while
检查(因为“true”始终为true),然后您将尝试使用该null指针

您可以将
while(true)
替换为
while(lines!=null)

这样做的典型模式是

while ((lines = reader.readLine()) != null) {
  //do stuff with lines
}

(请注意,在这里,您不会在while循环之外第一次调用readLine,因为您的条件将在第一次执行循环之前进行测试。)

您的字符串比较将始终失败

if(key.equals(lines.substring(0,key.length()-1)))
将尝试匹配“ImagePat”和“ImagePath”,这将失败。这将导致循环的第二次迭代,
现在等于null

你的比较应该是:

if (key.equals(lines.substring(0, key.length())))
此外,您的返回值应该是

returnValue = lines.substring(plusPos + 1, lines.length());
以正确返回值


您还应该查看
属性
类,它将使事情变得更简单。

字符串比较总是失败的

if(key.equals(lines.substring(0,key.length()-1)))
将尝试匹配“ImagePat”和“ImagePath”,这将失败。这将导致循环的第二次迭代,
现在等于null

你的比较应该是:

if (key.equals(lines.substring(0, key.length())))
此外,您的返回值应该是

returnValue = lines.substring(plusPos + 1, lines.length());
以正确返回值

您还应该查看
Properties
类,它将使事情变得更简单。