java字符串最大长度

publicvoidfind(Strings,Stringt)throwsIOException{inti=0,j=0,k,p=0,q=0,m=0,n=0,r=1,c=1... public void find (String s,String t)throws IOException{
int i=0,j=0,k,p=0,q=0,m=0,n=0,r=1,c=1;//r用于记录行号,c用于记录位置
while(i<s.length())
{ while(i<s.length() && j<t.length() )
{
if (j==-1 )//第一对字符不等,新一趟j=0;i++;
{ i++;j++;c++;
if(s.charAt(i)=='\n' ){
r++;
c=1;
}
}
else if(s.charAt(i)==t.charAt(j))//相等比较下一对/*charAt(index)用于获取单个字符*/
{ i++;j++;c++;
}
else
j=next[j];//新一趟,i不变(不用回溯)j确定起始位置
}
if(j==t.length())//有目标串分段存储
{ if(n==0){
newOutput o=new newOutput();
o.get_column();
}
k=c-t.length()-1;//k记录目标串首字符位置
n++;
newOutput o=new newOutput();
o.get_print(n, r,k);
p=i;// p记录当前目标串后第一个字符位置以便下一次操作
j=0;//初始化j接着扫描后面的字符

}
else if(i==s.length() && n==0)//检索到最后一个字符都没有匹配直接返回假
{ newOutput o = new newOutput();
o.get_error();
}
}

}

上述是我用KMP算法统计《百年孤独》第一章里“布恩迪亚”出现位置的主要函数,运行结果显示是对的,但是会报错:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 10236
at java.lang.String.charAt(Unknown Source)
at Riki.muc.string_match.newKMP.find(newKMP.java:38)
at Riki.muc.string_match.newKMP.main(newKMP.java:76)
麻烦大家帮帮忙看看怎么解决
对了,主要的出错行是38行,即:
if(s.charAt(i)=='\n' ){
r++;
c=1;
}
我用r统计行数,c统计该行字符数便于后面输出显示
展开
 我来答
趣事情
2015-10-07 · 知道合伙人互联网行家
趣事情
知道合伙人互联网行家
采纳数:517 获赞数:5452
电脑技术,软件开发。移动开发。网站建设相关专业知识。都可以提供解答和相关技术指导。

向TA提问 私信TA
展开全部
1.String内部是以char数组的形式存储,数组的长度是int类型,那么String允许的最大长度就是Integer.MAX_VALUE了,2147483647;
又由于java中的字符是以16位存储的,因此大概需要4GB的内存才能存储最大长度的字符串。所以,发送xml批量的需要在oracle数据库中用clob类型,而在java 端可以用String;

2. ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1");
if (rs.next())
{
java.sql.Clob clob = rs.getClob("CLOBATTR");
inStream = clob.getCharacterStream();
char[] c = new char[(int) clob.length()];
inStream.read(c);
//data是读出并需要返回的数据,类型是String
data = new String(c);
inStream.close();
}
inStream.close();
con.commit();
将爱归零
2015-01-03 · TA获得超过1342个赞
知道大有可为答主
回答量:2237
采纳率:100%
帮助的人:643万
展开全部

应该是这里你前面用了while(i<s.length())然后又执行了i++,之后执行s.charAt(i),那假设s字符串长度是20,i=19时会出现什么情况

 while(i<s.length() && j<t.length() )//如果i=19,继续执行
   {
    if (j==-1 )//我们假设成立,继续执行
     {  i++;j++;c++;
        if(s.charAt(i)=='\n' ){//i变成20-->下标越界
         r++;
            c=1;
        }
追问

我修改了条件,这样的话还是有错啊,难道我两个条件是一个意思

追答
if(s.charAt(i)=='\n' )改成这样看看if(i!=s.length()&&s.charAt(i)=='\n' )
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式