0 0

很郁闷——java字符串连接10

昨天调试程序,莫名其妙报告非法数据包。调试了一晚上,终于发现问题的根源

有1个字符串a = "aaaa:bbb "
b = a.split(":");
c=b[0]+":"+b[1];
c=?

我debug的时候发现居然等于"aaaa:bbb",想不通啊想不通。


问题补充
:号是我打错了。其实两个都一样。大家注意看一下,最后的空格没了。
空格在split(":")[1]里还有的,在做了+运算以后就没了。

我后来单独写测试类
"   "+"   "是没问题的,为什么啊。想不通

花费一晚上一点都不冤。

是一个很复杂的企业集成系统,谁也想不到字符串操作居然是这么一个结果。花费大半个晚上才找到这个问题,改是很容易的。


问题补充
哎~~~怪了

我在家里写的测试怎么不少空格呢?
class Split {
	public static void main(String[] args){
		String a = "aa:b ";
		String[] b = a.split(":");
		String c = b[0]+":"+b[1];
		int d = c.length();
		System.out.println(d);//家里5,如果是在公司,这里是4
	}
}



另外说明一下环境。我公司用的开发环境是Message Broker Toolkit 6.1。虚拟机不晓得是什么,应该是IBM兼容JDK5的版本(偶能用泛型等)。

另外昨天晚上测试的时候,上面的代码如果b = a.replace(":");b也是没空格的。

但是"  "+"  "就没事。确实很挠头。
问题补充
楼上的。我这里要澄清一下。

事情的起因是互相交互的几个系统之间调用出错,经过大半夜的检测,发现是一个结束要求是空格的xml字符串 在进行了replace(“$某些固定要进行替换的字串”)操作以后,最后的空格不见了。反复debug多次确认这个很诡异的问题以后,我们将xml字符串分为前后两个字符串。前面的包含要替换的字符,后面的包含空格。前半部分经过替换以后,和后半部分相加。结果我们发现相加后的字符空格也丢失了,而+操作之前的后半部分还是有空格的。

是一个很诡异的问题,反复测试多次。最后解决方案是空格用特殊符号替换。然后再替换回来。
问题补充:
兄弟们搞清楚我的描述

1,在split之后形成的字符串里,空格还在
2,讲split后的字符串+,新字符串里空格不在了


2009年1月01日 22:20

21个答案 按时间排序 按投票排序

0 0

兄弟们搞清楚我的描述

1,在split之后形成的字符串里,空格还在
2,讲split后的字符串+,新字符串里空格不在了



对你的回答,先分后加,结果里面的空格还在没有丢,你出现在那个问题肯定是jdk版本的问题

2009年1月08日 16:28
0 0

路过  路过

2009年1月08日 13:29
0 0

呵呵...路過...

2009年1月07日 15:51
0 0

IBM JDK?
那玩意很多奇怪事情发生的。
比如
<?xml version="1.0"?>
<aaaa></aaaa>
你如果要拼接<aaaa>和</aaaa>可能会失效。
StringBuffer也是。

2009年1月07日 14:28
0 0

split是用正则表达式切割
"."表示任意字符..
所以要用转义字符
"\."

2009年1月07日 10:48
0 0

这个不是BUG,这个是由于spilt 中用的是正则来分割的。所以要将分割符转义

2009年1月06日 11:45
0 0

        String a = "aa:b ";   
        String[] b = a.split(":");   
        String c = b[0]+":"+b[1];   
        System.out.println(b[0]);
        System.out.println(b[1]);       
        int d = c.length();   
        System.out.println(d);//家里5,如果是在公司,这里是4   

我的机器的结果是
aa
b
5

2009年1月06日 10:12
0 0

我和结论是用split去分字符串的时候只是按着分隔符把字符串切成两半,在javascript中和在java类中都是一样,如果你的不一样,我觉得是jdk版本的原因,你可以打开你们公司安装jdk的路径下,打开源代码和你家电脑安的jdk的源代码比比split方法的实现,
java类中
public class TestStr {
public static void main(String[] args){  
        String a = "aa:b ";  
        String[] b = a.split(":");  
        String c = b[0]+":"+b[1];  
        int d = c.length();  
        System.out.println("c=|"+c+"|");
        System.out.println(d);//家里5,如果是在公司,这里是4  
        System.out.println(a.length());
    }  

}
运行的结果是:
c=|aa:b |
5
5


在html文件中
<script language="javascript">
function tt(){
var a = "aaaa:bbb "
var b = a.split(":");
var c=b[0]+":"+b[1];
alert("c==  |"+c+"|"+"看看长度=="+c.length);

}
</script>
<input type="button" id=id name=name value="看看" onclick="tt();">


运行的结果是
c== |aaaa:bbb |看看长度==9

2009年1月05日 20:39
0 0

也有可能是XML解析库默认略掉末尾的空格。

2009年1月03日 22:27
0 0

机器上刚好有IBM的JDK和SUN的JDK
IBM的JDK:
j

ava version "1.6.0"
Java(TM) SE Runtime Environment (build pwi3260sr2-20080818_01(SR2))
IBM J9 VM (build 2.4, J2RE 1.6.0 IBM J9 2.4 Windows XP x86-32 jvmwi3260-20080816
_22093 (JIT enabled, AOT enabled)
J9VM - 20080816_022093_lHdSMr
JIT  - r9_20080721_1330ifx2
GC   - 20080724_AA)
JCL  - 20080808_02

SUN的JDK:
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) Client VM (build 11.0-b15, mixed mode, sharing)

运行结果一样:均为5,而不是
引用
//家里5,如果是在公司,这里是4 

看来,公司的IBM JDK或者JRE有BUG。

2009年1月01日 23:13
0 0

“空字符串”不是“全是空格的字符串”的意思。

正确的意思是:

代码


String str = "aaa:bbb  :";

String[] strings = str.split(":");

out.println("This string split to "+ strings.length
     + " pieces.");


运行后输出

引用


This string split to 2 pieces.



最后的""没有包含在结果里。


这个问题的确是IBM JDK的Bug。

2009年1月01日 22:27
0 0

诡异的现象

代码

引用

        String str = "aaa:bbb  ";

        String[] strings = str.split(":");

        out.println("This string split to "+ strings.length
                + " pieces.");
       
        out.println("Length of string[0] is: " + strings[0].length());
        out.println("Length of string[1] is: " + strings[1].length());


运行后输出

引用

This string split to 2 pieces.
Length of string[0] is: 3
Length of string[1] is: 5


编译器是SUN JDK6U7

2009年1月01日 22:20
0 0

建议去看split的src里的内容,

2009年1月01日 22:20
0 0

bonny 写道
哎~~~怪了

我在家里写的测试怎么不少空格呢?
class Split {
	public static void main(String[] args){
		String a = "aa:b ";
		String[] b = a.split(":");
		String c = b[0]+":"+b[1];
		int d = c.length();
		System.out.println(d);//家里5,如果是在公司,这里是4
	}
}



另外说明一下环境。我公司用的开发环境是Message Broker Toolkit 6.1。虚拟机不晓得是什么,应该是IBM兼容JDK5的版本(偶能用泛型等)。

另外昨天晚上测试的时候,上面的代码如果b = a.replace(":");b也是没空格的。

但是"  "+"  "就没事。确实很挠头。


java api

 

split

public String[] split(String regex)
根据给定的正则表达式的匹配来拆分此字符串。

该方法的作用就像是使用给定的表达式和限制参数 0 来调用两参数 split 方法。因此,结果数组中不包括结尾空字符串。

例如,字符串 "boo:and:foo" 产生带有下面这些表达式的结果:

Regex 结果
: { "boo", "and", "foo" }
o { "b", "", ":and:f" }

 

参数:
regex - 定界正则表达式
返回:
字符串数组,根据给定正则表达式的匹配来拆分此字符串,从而生成此数组。
抛出:
PatternSyntaxException - 如果正则表达式的语法无效
从以下版本开始:
1.4
另请参见:
Pattern

2009年1月01日 22:20
0 0

从eclipse这一点就能看出,IBM的Java实在弄得不怎么样。

但是没办法,谁让SUN的机器卖得那么贵。

2009年1月01日 22:20
0 0

bonny 写道
:号是我打错了。其实两个都一样。大家注意看一下,最后的空格没了。
空格在split(":")[1]里还有的,在做了+运算以后就没了。

我后来单独写测试类
"   "+"   "是没问题的,为什么啊。想不通

花费一晚上一点都不冤。

是一个很复杂的企业集成系统,谁也想不到字符串操作居然是这么一个结果。花费大半个晚上才找到这个问题,改是很容易的。


public class Split {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str = "aaaa:bbb";
		String[] strs = str.split(":");
		for (String string : strs) {
			System.out.println(string);
		}
	}

}

结果:
aaaa
bbb

2009年1月01日 22:20
0 0

eyeshot 写道
一晚上?楼上绝对是强人!!



               不是我..

2009年1月01日 22:20
0 0

一晚上?楼上绝对是强人!!

2009年1月01日 22:20
0 0

   我试了一下也想不通..一开始也想不通.
 
                      最后发现 你两个冒号 都不是一个..  你在Javaeye上都能发现.
                  

2009年1月01日 22:20
0 0

是不是因为前面那个冒号是全角的缘故……

2009年1月01日 22:20
0 0

哈哈,这个问题搞了一晚上吗?我们的政委应该下基层体验生活了

2009年1月01日 22:20

相关推荐

    java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节;

    java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java ...

    后缀数组——处理字符串的有力工具1

    后缀数组是一种在字符串处理中非常重要的数据结构,它被广泛应用于信息学竞赛和算法设计中。后缀数组可以看作是一系列字符串后缀的排序,其中每个元素都是原字符串的一个后缀,按字典序排列。相比于后缀树,后缀数组...

    java 字符串工具类 java 字符串工具类

    java 字符串工具类 java 字符串工具类java 字符串工具类 java 字符串工具类java 字符串工具类 java 字符串工具类java 字符串工具类 java 字符串工具类java 字符串工具类 java 字符串工具类java 字符串工具类 java ...

    java反射机制 字符串——java对象

    在Java反射机制中,字符串可以用来表示类名、方法名或参数类型,是连接代码与运行时类信息的桥梁。 在Java中,将Java对象的数据封装成XML格式的字符串,通常涉及到对象序列化的过程。对象序列化是将对象的状态转换...

    java字符串练习

    总的来说,Java字符串处理涉及的方法很多,包括但不限于`split()`, `substring()`, `indexOf()`, `replace()`, `trim()`等。理解并熟练运用这些方法对于提升Java编程技能非常有帮助。对于初学者而言,通过实践上述...

    java 字符串 正则表达式 详细实例代码

    在Java编程语言中,字符串(String)是至关重要的数据类型,用于存储和操作文本。字符串类提供了丰富的API,使得处理字符串变得高效且灵活。本篇将深入探讨Java中的字符串、正则表达式及其在实际编程中的详细实例代码...

    后缀数组——处理字符串的有力工具.pdf

    但是这个比较神仙的东西在网上的讲解一般都仅限于思想而不是代码,而且这个东西开一堆数组,很多初学者写代码的时候很容易发生歧义理解,所以这里给出一个比较详细的讲解。笔者自己也是和后缀数组硬刚了一个上午外加...

    java字符串处理取出括号内的字符串

    在Java编程语言中,字符串处理是一项常见的任务,特别是在解析、分析或操作文本数据时。本篇文章将深入探讨如何从字符串中提取括号内的内容,主要关注于基础的字符串操作、正则表达式以及如何利用这些工具来实现目标...

    一个可重用的VC++字符串处理函数集 IsNumeric——检查串是否为数字串 Upcase——变成大写串 right——从右到左截掉字符 Trim——截掉串尾的空格 空格 mid——截掉从某个起始位置到右边位置的字符

    一个VC++可重用的字符串处理函数集,这些函数主要包括:  IsNumeric——检查串是否为数字串  Upcase——变成大写串  right——从右到左截掉字符  Lowercase——变成小写串  Trim——截掉串尾的空格  ...

    java字符串连接效率测试代码

    用于测试java字符串几种连接方式的效率,主要包括四类对比测试:1,StringBuffer连接,2,String的Format连接,3,String相加连接,4,StringBuffer的append串起来连接。测试结果如下: String Buffer: 580ms String...

    java通用字符串连接

    `java通用字符串连接`这个主题关注的是如何高效且灵活地将这些集合中的元素合并成一个单一的字符串,同时允许自定义连接分隔符和字符串提取规则。下面将详细解释这一知识点。 首先,字符串连接在Java中最基本的方式...

    java压缩字符串

    java压缩字符串

    Java检索字符串中是否存在某字符

    在Java编程语言中,字符串处理是一项基础且重要的任务。标题提到的"Java检索字符串中是否存在某字符",实际上涉及到字符串的查找算法。这里主要讨论的是KMP(Knuth-Morris-Pratt)算法,这是一种高效的字符串匹配...

    89.java字符串方法.zip

    89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符...

    java字符串中${}或者{}等的占位符替换工具类

    Java字符串中${}或者{}等占位符替换工具类 Java字符串中${}或者{}等占位符替换工具类是一个功能强大且实用的工具类,它可以将Java字符串中的占位符依次替换为指定的值。该工具类的主要功能是实现占位符的替换,即将...

    JAVA字符串处理函数列表一览.

    ### JAVA字符串处理函数列表一览 在Java编程语言中,字符串处理是极其常见且重要的操作之一。Java为`String`类提供了丰富的内置方法,使得开发者能够高效地进行字符串操作。本文将详细介绍部分常用的字符串处理函数...

    96.java字符串反转案例.zip

    96.java字符串反转案例.zip96.java字符串反转案例.zip96.java字符串反转案例.zip96.java字符串反转案例.zip96.java字符串反转案例.zip96.java字符串反转案例.zip96.java字符串反转案例.zip96.java字符串反转案例.zip...

Global site tag (gtag.js) - Google Analytics