今天看了一点JDK的代码,不巧居然看到了 JDK 的一个小 bug, 呵呵。且看 javax.sql.rowset.serial 包下的 SerialBlob 类,其中有段代码如下
/**
* Returns the position in this <code>SerialBlob</code> object where
* the given pattern of bytes begins, starting the search at the
* specified position.
*
* @param pattern the pattern of bytes for which to search
* @param start the position of the byte in this
* <code>SerialBlob</code> object from which to begin
* the search; the first position is <code>1</code>;
* must not be less than <code>1</code> nor greater than
* the length of this <code>SerialBlob</code> object
* @return the position in this <code>SerialBlob</code> object
* where the given pattern begins, starting at the specified
* position; <code>-1</code> if the pattern is not found
* or the given starting position is out of bounds; position
* numbering for the return value starts at <code>1</code>
* @throws SerialException if an error occurs when serializing the blob
* @throws SQLException if there is an error accessing the <code>BLOB</code>
* value from the database
*/
public long position(byte[] pattern, long start)
throws SerialException, SQLException {
if (start < 1 || start > len) {
return -1;
}
int pos = (int)start-1; // internally Blobs are stored as arrays.
int i = 0;
long patlen = pattern.length;
while (pos < len) {
if (pattern[i] == buf[pos]) {
if (i + 1 == patlen) {
return (pos + 1) - (patlen - 1);
}
i++; pos++; // increment pos, and i
} else if (pattern[i] != buf[pos]) {
pos++; // increment pos only
}
}
return -1; // not found
}
这个方法用于查找 blob 中是否存在 pattern 的字符数组,细看之下发现一个小 bug, 且看这段代码
int pos = (int)start-1; // internally Blobs are stored as arrays.
int i = 0;
long patlen = pattern.length;
while (pos < len) {
if (pattern[i] == buf[pos]) {
if (i + 1 == patlen) {
return (pos + 1) - (patlen - 1);
}
i++; pos++; // increment pos, and i
} else if (pattern[i] != buf[pos]) {
pos++; // increment pos only
}
}
当发现字符不匹配的情况下,应该将 i 置零,否则匹配结果是不正确的。当改为
int pos = (int)start-1; // internally Blobs are stored as arrays.
int i = 0;
long patlen = pattern.length;
while (pos < len) {
if (pattern[i] == buf[pos]) {
if (i + 1 == patlen) {
return (pos + 1) - (patlen - 1);
}
i++; pos++; // increment pos, and i
} else if (pattern[i] != buf[pos]) { // 其实这个判断也没有必要
pos++;
i = 0; // 在此处将 i 置 0
}
}
分享到:
- 2009-10-10 16:30
- 浏览 935
- 评论(0)
- 论坛回复 / 浏览 (0 / 1283)
- 查看更多
相关推荐
标题 "jdk6 jboss5 webservice bug" 暗示了这是一个关于Java开发环境中,具体是JDK 6和JBoss Application Server 5版本中Web服务(Webservice)出现的问题。这个问题可能是由于某些兼容性、配置错误或者已知的bug...
JDK 7,也被称为JDK 1.7,是Oracle公司发布的一个重要版本,它引入了许多新特性,优化了性能,并修复了大量的bug。通过深入学习JDK 7的源代码,开发者可以更好地理解Java语言的工作原理,提高编程技能,并对新旧版本...
OpenJDK是JDK的一个开源实现,由甲骨文公司(Oracle)主导,并由全球的开发者社区共同维护。OpenJDK6是OpenJDK项目针对Java 6版本的源代码,它的开放性使得开发者能够深入理解Java的内部机制,从而进行定制化开发...
Java JDK 1.8.0_25 是Oracle公司...总的来说,Java JDK 1.8.0_25是一个强大且功能丰富的开发工具,它的特性改进对于提升Java编程的效率和代码质量有着显著的帮助。对于Java开发者而言,掌握这一版本的JDK使用至关重要。
在本例中,我们讨论的是JDK的11.0.10版本,这是一个重要的中间版本,提供了一些关键的增强和修复。 JDK 11是Java的一个长期支持(LTS)版本,这意味着它将得到Oracle长达至少6年的技术支持,包括安全更新和性能优化...
JDK 8u191是Oracle公司在转向收费模式之前的最后一个免费稳定版本,对于许多开发者而言,它具有重要的历史意义和实用性。 ### JDK 8 的关键特性 1. **Lambda表达式**: JDK 8引入了函数式编程的关键特性——Lambda...
6. **新的 Nashorn JavaScript引擎**:JDK 1.8包含了一个新的JavaScript引擎Nashorn,允许Java代码直接执行JavaScript代码,实现了Java与JavaScript之间的交互。 ### JDK 1.8.0_152的更新 - **安全性增强**:此...
JDK 1.8.0_131是1.8版本的一个更新,它包含了bug修复、安全更新和性能改进。每个小版本的更新都是为了提高稳定性和兼容性,确保开发者可以使用一个更加可靠和安全的环境。例如,_131这个版本可能修复了之前版本中的...
JDK 1.7.0_80是Oracle公司发布的Java 7的一个更新版本,其版本号中的"80"表示该版本的更新次数或修补级别。这个版本在Java 7的基础上修复了一些已知问题,提高了性能,并增加了新的功能。 首先,让我们详细了解一下...
Java Development Kit (JDK) 是Java编程语言的核心组件,它包含了一个Java运行环境(JRE)、编译器(javac)以及其他工具,如jar、javadoc等,用于开发和运行Java应用程序。标题和描述中提到的"jdk-8u25、jdk-8u111...
版本的不断更新、升级,无非是对bug的修复、新功能的增加、优化等,在JDK版本中,JDK1.8变得备受关注,也成了各大公司面试中常常被问及的话题。 一、JDK1.8优点概括 1、速度更快 由于底层结构和JVM的改变,使得JDK...
随JDK 1.8.0_202提供的“jdk-8u202-windows-x64最后一个不收费的jdk版本windows版.docx”文档,详细介绍了这个版本的特点、安装步骤和使用指南,对于初学者和开发者来说是一份宝贵的参考资料。 总结,JDK 1.8.0_202...
Java 8是Java历史上的一个重要版本,引入了Lambda表达式、函数式编程概念、Stream API、新的日期和时间API等重大改进。对于开发者来说,了解这些新特性对于提高代码质量和效率至关重要。 2. jdk-8u162-windows-x64...
JDK 1.8.0_161是Java 8的一个稳定版本,它提供了许多对开发者友好的特性,如Lambda表达式、Stream API等,同时也包含了安全修复和性能优化。通过持续的维护和更新,Oracle确保了开发者可以使用可靠、高效的开发环境...
标题“redis jar JDK1.6”指的是在Java开发环境中,使用Redis作为缓存来实现Session共享,...同时,对于那些仍在使用JDK1.6和Tomcat6的老系统来说,这是一个升级Session管理策略的好方法,而无需进行大规模的代码重构。
JDK1.6.26是Java平台标准版(Java SE)的一个版本,它包含了Java编译器、Java运行时环境、Java类库以及各种开发工具,如Javadoc和JConsole。在Java开发中,JDK扮演着核心角色,为程序员提供了编写、测试和调试Java...
总之,JDK 1.8.0_91是Java 8的一个重要版本,其特性如Lambda表达式、Stream API和新的日期时间API极大地提升了Java的生产力和代码质量。在使用过程中,开发者应充分利用这些新特性,并关注版本的更新和安全维护。
Lambda表达式是JDK1.8的一个重要特性,它简化了对匿名内部类的使用,使得代码更加简洁和易读。通过使用 Lambda,我们可以将函数作为参数传递,或者将函数直接定义为方法体。这在处理集合操作时尤其有用,配合Stream ...
`jdk1.8.0_121`版本是在Java 8发布后的一个更新,主要包含了bug修复、性能优化和安全更新。由于官方下载通道可能出现问题,提供此版本的下载链接是为了确保开发者能够获取到可靠的JDK安装包。 在使用这个版本的JDK...