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统计该行字符数便于后面输出显示 展开
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统计该行字符数便于后面输出显示 展开
2个回答
2015-10-07 · 知道合伙人互联网行家
关注
展开全部
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();
又由于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();
展开全部
应该是这里你前面用了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' )
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询