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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张雪萍 中级黑马   /  2013-3-13 01:14  /  1140 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张雪萍 于 2013-3-13 09:47 编辑

public class testSplit{  
public static void main(String args[])  
{  
String str ="1\2\3";  
try{  
System.out.println((str.split("\\").length));  
}catch(Exception e){  
  System.out.println("error");  
  System.err.println(e.getMessage());  
   
}  
}  
}  

抛出错误:Unexpected internal error near index 1  
\  
^  
请问是哪出问题了?谢谢拉!   

点评

楼主,注意代码使用编辑功能里的插入代码,下次再发现扣分的哦  发表于 2013-3-13 09:46

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

5 个回复

正序浏览
代码格式有点乱,代码也是需要整洁滴  {:soso_e197:}
回复 使用道具 举报
你先把try。。。catch块注释掉,然后打印一下str,看看str到底保存的是什么?上面发图又失败了,看不到啊,打印出来的是1加一个笑脸符号再加一个心形符号

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1 参与有奖

查看全部评分

回复 使用道具 举报
正解代码是
  1. public class testSplit
  2. {  
  3.         public static void main(String args[])  
  4.         {  
  5.                 String str ="1\2\3";  
  6.                    try
  7.                 {
  8.                         System.out.println((str.split("\\\\").length));  //如果字符串中含有'\’;使用split转换时,应该传'\\\\'
  9.                 }
  10.                 catch(Exception e)
  11.                 {  
  12.                         System.out.println("error");  
  13.                         System.err.println(e.getMessage());  
  14.                 }  
  15.         }  
  16. }
复制代码
不过上面的运行结果是1,我想你应该想得到结果是3,代码是
  1. public class testSplit
  2. {  
  3.         public static void main(String args[])  
  4.         {  
  5.                 String str ="1\\2\\3";  
  6.                    try
  7.                 {
  8.                         System.out.println((str.split("\\\\").length));  //如果字符串中含有'\’;使用split转换时,应该传'\\\\'
  9.                 }
  10.                 catch(Exception e)
  11.                 {  
  12.                         System.out.println("error");  
  13.                         System.err.println(e.getMessage());  
  14.                 }  
  15.         }  
  16. }
复制代码
运行结果是3

分析:      使用String对象的public String[] split(String regex)方法时,如果String对象是以'\'分隔的话,必须在split中传入'\\\\'才能识别
         对于上面的代码为什么输入的是1呢?你看看,String str ="1\2\3"; 打印一下发现str指向的是这个字符串 D:\1.png
         因为str中包含了转义字符\,它将\2和\3都转义成了两个符号,如图,当用split("\\\\")拆分str时,str并不包含'\';所以得到的结果是一个
         只有一个元素的数组,故其length=1;
               再如第二道代码,String str ="1\\2\\3";'\'已经被转义,str中包含'\',所以用split方法拆分时,能得到一个包含3个元素的数组,故该
         数组的length=3;

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
楼上内容为evernote中的笔记。。。可能是哪年哪月从网上接下来的。。大家看到类似的不要吐槽。。
解决问题才是关键。
代码改成这样就可以了:
public class Demo {

        public static void main(String[] args) {

                String str = "1\\2\\3";
                try {
                        String[] s = str.split("\\\\");
                        System.out.println((s.length));
                } catch (Exception e) {
                        System.out.println("error");
                        System.err.println(e.getMessage());

                }
        }

}
回复 使用道具 举报
刚好evernote里有关于这方面的笔记。。、
妹子的问题必须给力。。
java 数组 split~java 中 split() 一点经验 
 特别注意的是:如果使用“\”分割,则需要使用“\\\\”来分割!
  在java.lang包中有String.split()方法,返回是一个数组
  我在应用中用到一些,给大家总结一下,仅供大家参考:
  1、如果用“.”作为分隔的话,必须是如下写法:String.split("\\."),这样才能正确的分隔开,不能用String.split(".");
  2、如果用“|”作为分隔的话,必须是如下写法:String.split("\\|"),这样才能正确的分隔开,不能用String.split("|");
  “.”和“|”都是转义字符,必须得加"\\";
  3、如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如:“acount=? and uu =? or n=?”,把三个都分隔出来,可以用String.split("and|or");
  使用String.split方法分隔字符串时,分隔符如果用到一些特殊字符,可能会得不到我们预期的结果。
  我们看jdk doc中说明 public String[] split( String regex)
  Splits this string around matches of the given regular expression.
  参数regex是一个 regular-expression的匹配模式而不是一个简单的String,他对一些特殊的字符可能会出现你预想不到的结果,比如测试下面的代码:
  用竖线 | 分隔字符串,你将得不到预期的结果
  String[] aa = "aaa|bbb|ccc".split("|");
  //String[] aa = "aaa|bbb|ccc".split("\\|"); 这样才能得到正确的结果
  for (int i = 0 ; i <aa.length ; i++ ) {
  System.out.println("--"+aa[i]);
  }
  用竖 * 分隔字符串运行将抛出java.util.regex.PatternSyntaxException异常,用加号 + 也是如此。
  String[] aa = "aaa*bbb*ccc".split("*");
  //String[] aa = "aaa|bbb|ccc".split("\\*"); 这样才能得到正确的结果
  for (int i = 0 ; i <aa.length ; i++ ) {
  System.out.println("--"+aa[i]);
  }
  显然,+ * 不是有效的模式匹配规则表达式,用"\\*" "\\+"转义后即可得到正确的结果。
  "|" 分隔串时虽然能够执行,但是却不是预期的目的,"\\|"转义后即可得到正确的结果。
  还有如果想在串中使用"\"字符,则也需要转义.首先要表达"aaaa\bbbb"这个串就应该用"aaaa\\bbbb",如果要分隔就应该这样才能得到正确结果:
  
String[] aa = "aaa\\bbb\\bccc".split("\\\\");


评分

参与人数 2技术分 +1 黑马币 +2 收起 理由
黄玉昆 + 1
安鹏宇 + 2 谢谢了,看看你的总结让我学到不少,虽然我.

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马