A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 雨的印记yp 中级黑马   /  2013-12-24 17:34  /  1048 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我自定义了一个将字符串反转的方法:传入一个原字符串,可以将其反转返回一个新的字符串。
方法里,定义一个StringBuffer,长度和String相同。
然后定义两个指针分别指向原字符串首位置和新字符串尾位置。
遍历字符串并将原字符串每个字符反向加入到新字符串,
然后将StringBuffer toString

代码
  1. public class StringTest2 {

  2.         public static void main(String[] args) {
  3.                
  4.                 String str = "hello,java";
  5.                 String newStr = myReverse(str);
  6.                 System.out.println(newStr);
  7.         }
  8.        
  9.         /*
  10.          * 定义一个StringBuffer字符串
  11.          * 循环遍历原字符串,将每一位字符按逆序存储到新字符串中
  12.          * */
  13.         public static String myReverse(String str){
  14.                
  15.                 //定义StringBuffer字符串,长度和原字符串相同
  16.                 StringBuffer sb = new StringBuffer(str.length());
  17.                
  18.                 //定义指针指向原字符串头位置
  19.                 int head = 0;
  20.                 //定义指针指向新字符串尾位置
  21.                 int tail = sb.length()-1;
  22.                
  23.                 for(;head < str.length(); head++,tail--){
  24.                         //取出原字符串字符
  25.                         char ch = str.charAt(head);
  26.                         //将字符放入新字符串
  27.                         sb.setCharAt(tail, ch);
  28.                 }
  29.                 return sb.toString();
  30.         }
  31. }
复制代码
结果String newStr = myReverse(str); 出现异常

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1



评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

6 个回复

倒序浏览
StringBuffer sb = new StringBuffer(str.length());  //仅仅是得到  类似于new StringBuffer(10)的对象
sb.length()将会是0
回复 使用道具 举报
字符串边界溢出异常。
sb.length() = 0;所以int tail = sb.length()-1中tail = -1;
在执行sb.setCharAt(tail, ch);语句是出现异常

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
        这是字符串范围超出索引值的报错
  所以我们第一步就去查找哪里的字符串索引值出现的问题?
StringBuffer sb = new StringBuffer(str.length());//这里初始化了多少的内存空间。
int tail = sb.length()-1;//length方法是返回StringBuffer底层的字符数组长度,现在你的字符数组是0,所以tail是-1;
sb.setCharAt(tail, ch);//这里就是从索引值为-1处开始,当然报错
如下修改

/*
  * 思路1.先将str从后向前遍历,获取到的每一个元素添加到新的字符串上
  *
  * */

package feihao.test;

public class HelloWorld {

        public static void main(String[] args) {
               
                String str = "hello,java";
                String newStr = myReverse(str);
                System.out.println(newStr);
        }
        
        /*
         * 定义一个StringBuffer字符串
         * 循环遍历原字符串,将每一位字符按逆序存储到新字符串中
         * */
        public static String myReverse(String str){
               
                //定义StringBuffer字符串,长度和原字符串相同
                StringBuffer sb = new StringBuffer(str.length());//这里初始化了多少的内存空间。
               
                //定义指针指向原字符串尾位置
                int head = str.length() - 1;
               
               
               for(;head >= 0; head--){
                        //取出原字符串字符
                        char ch = str.charAt(head);
                        //将字符放入新字符串
                        sb.append(ch);
                }
                return sb.toString();
        }
}

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报 1 0
弘一 发表于 2013-12-24 21:26
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: - ...

太感谢了,豁然开朗!
回复 使用道具 举报
小骗子 发表于 2013-12-24 21:08
StringBuffer sb = new StringBuffer(str.length());  //仅仅是得到  类似于new StringBuffer(10)的对象
sb ...

理解了,谢谢
回复 使用道具 举报
xplcc 发表于 2013-12-24 21:11
字符串边界溢出异常。
sb.length() = 0;所以int tail = sb.length()-1中tail = -1;
在执行sb.setCharAt(ta ...

理解了,谢谢。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马