疯了!和书上一模一样的Java代码,偏偏运行出错!!高手看看
importjava.io.*;publicclassPushbackTest{publicstaticvoidmain(String[]args){PushbackRe...
import java.io.*;
public class PushbackTest
{
public static void main(String[] args)
{
PushbackReader pr=null;
try
{
pr=new PushbackReader(new FileReader("PushbackTest.java"),64);
char[] buf=new char[32];
String lastContent="";
int hasRead=0;
while ((hasRead=pr.read(buf))>0)
{
String content=new String(buf,0,hasRead);
int targetIndex = 0;
if ((targetIndex = (lastContent + content).indexOf("new PushbackReader")) > 0)
{
pr.unread((lastContent+content).toCharArray());
pr.read(buf , 0 , targetIndex);
System.out.print(new String(buf,0,targetIndex));
System.exit(0);
}
else
{
System.out.print(lastContent);
lastContent=content;
}
}
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
finally
{
try
{
if (pr!=null)
pr.close();
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
}
运行后如下错误: 展开
public class PushbackTest
{
public static void main(String[] args)
{
PushbackReader pr=null;
try
{
pr=new PushbackReader(new FileReader("PushbackTest.java"),64);
char[] buf=new char[32];
String lastContent="";
int hasRead=0;
while ((hasRead=pr.read(buf))>0)
{
String content=new String(buf,0,hasRead);
int targetIndex = 0;
if ((targetIndex = (lastContent + content).indexOf("new PushbackReader")) > 0)
{
pr.unread((lastContent+content).toCharArray());
pr.read(buf , 0 , targetIndex);
System.out.print(new String(buf,0,targetIndex));
System.exit(0);
}
else
{
System.out.print(lastContent);
lastContent=content;
}
}
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
finally
{
try
{
if (pr!=null)
pr.close();
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
}
运行后如下错误: 展开
3个回答
展开全部
如下情况会发生你遇到的越界错误:
1.在某次读取后未找到字符串,这时 lastContent=content,lastContent长度为32。
2.接下来的读取后,content中包含要找的字符串。
3.targetIndex = (lastContent + content).indexOf的结果一定大于32
4.再接下来的pr.read时由于targetIndex大于32,大于buf的长度,发生越界
1.在某次读取后未找到字符串,这时 lastContent=content,lastContent长度为32。
2.接下来的读取后,content中包含要找的字符串。
3.targetIndex = (lastContent + content).indexOf的结果一定大于32
4.再接下来的pr.read时由于targetIndex大于32,大于buf的长度,发生越界
追问
我找到问题出现在什么地方了。“pr=new PushbackReader(new FileReader("PushbackTest.java"),64);”只要在这句的“=”左右分别加上空格就行了。问题是为什么会这样。按你的分析,加上空格后,targetIndex的结果更是大于32才对。可是偏偏加了空格运行就没问题。奇怪啊!
追答
空格应该是被忽略的,加不加对于编译结果都没影响。加了空格后程序运行都正常了?如果这样我只能说我才疏学浅了。while里面的循环体部分改成下面的样子应该就正常了。(这种改法并不完美)
String content = new String( buf, 0, hasRead );
int targetIndex = ( lastContent + content ).indexOf( "new PushbackReader" );
if ( 0 <= targetIndex && targetIndex <= 32 ) {
pr.unread( ( lastContent + content ).toCharArray() );
pr.read( buf, 0, targetIndex );
System.out.print( new String( buf, 0, targetIndex ) );
System.exit( 0 );
} else {
System.out.print( lastContent );
lastContent = content;
}
展开全部
pr=new PushbackReader(new FileReader("d:/PushbackTest.java"),64);
这一有问题,,,书上加载的路径和你运行的路径不一样。。。这个FileReader(String fileName)的构造函数的实参是文件的绝对路径的字符串,,,d:/PushbackTest.java为我在D盘下运行
这一有问题,,,书上加载的路径和你运行的路径不一样。。。这个FileReader(String fileName)的构造函数的实参是文件的绝对路径的字符串,,,d:/PushbackTest.java为我在D盘下运行
更多追问追答
追问
这是原书代码,运行没有问题……应该和路径无关!
追答
但你原来报的错是因找不到文件,再次读取空pr时引发数组越界IndexOutOfBoundsException,我加了绝对路径能正常运行 ,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没仔细看,明显数字越界,你那个buf存得下么
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询