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
类,它将使事情变得更简单。