`
eclipse07
  • 浏览: 21682 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

JDK代码的一个小bug

阅读更多
今天看了一点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
            }                                    
        } 

分享到:
评论

相关推荐

    jdk6 jboss5 webservice bug

    标题 "jdk6 jboss5 webservice bug" 暗示了这是一个关于Java开发环境中,具体是JDK 6和JBoss Application Server 5版本中Web服务(Webservice)出现的问题。这个问题可能是由于某些兼容性、配置错误或者已知的bug...

    jdk7源代码

    JDK 7,也被称为JDK 1.7,是Oracle公司发布的一个重要版本,它引入了许多新特性,优化了性能,并修复了大量的bug。通过深入学习JDK 7的源代码,开发者可以更好地理解Java语言的工作原理,提高编程技能,并对新旧版本...

    jdk6&openjdk;源代码

    OpenJDK是JDK的一个开源实现,由甲骨文公司(Oracle)主导,并由全球的开发者社区共同维护。OpenJDK6是OpenJDK项目针对Java 6版本的源代码,它的开放性使得开发者能够深入理解Java的内部机制,从而进行定制化开发...

    Java:jdk1.8.0_25(少个jre)

    Java JDK 1.8.0_25 是Oracle公司...总的来说,Java JDK 1.8.0_25是一个强大且功能丰富的开发工具,它的特性改进对于提升Java编程的效率和代码质量有着显著的帮助。对于Java开发者而言,掌握这一版本的JDK使用至关重要。

    jdk-11.0.10.jdk.zip

    在本例中,我们讨论的是JDK的11.0.10版本,这是一个重要的中间版本,提供了一些关键的增强和修复。 JDK 11是Java的一个长期支持(LTS)版本,这意味着它将得到Oracle长达至少6年的技术支持,包括安全更新和性能优化...

    jdk-8u191-windows-x64 oracle 收费前最后一个稳定版本

    JDK 8u191是Oracle公司在转向收费模式之前的最后一个免费稳定版本,对于许多开发者而言,它具有重要的历史意义和实用性。 ### JDK 8 的关键特性 1. **Lambda表达式**: JDK 8引入了函数式编程的关键特性——Lambda...

    jdk1.8.0_152

    6. **新的 Nashorn JavaScript引擎**:JDK 1.8包含了一个新的JavaScript引擎Nashorn,允许Java代码直接执行JavaScript代码,实现了Java与JavaScript之间的交互。 ### JDK 1.8.0_152的更新 - **安全性增强**:此...

    jdk1.8,32位和64位版本,jdk1.8.0_131

    JDK 1.8.0_131是1.8版本的一个更新,它包含了bug修复、安全更新和性能改进。每个小版本的更新都是为了提高稳定性和兼容性,确保开发者可以使用一个更加可靠和安全的环境。例如,_131这个版本可能修复了之前版本中的...

    jdk1.7.0_80

    JDK 1.7.0_80是Oracle公司发布的Java 7的一个更新版本,其版本号中的"80"表示该版本的更新次数或修补级别。这个版本在Java 7的基础上修复了一些已知问题,提高了性能,并增加了新的功能。 首先,让我们详细了解一下...

    jdk-8u25、jdk-8u111、jdk-8u131、jdk-8u181、jdk-8u201

    Java Development Kit (JDK) 是Java编程语言的核心组件,它包含了一个Java运行环境(JRE)、编译器(javac)以及其他工具,如jar、javadoc等,用于开发和运行Java应用程序。标题和描述中提到的"jdk-8u25、jdk-8u111...

    jdk1.8.0版本安装包

    版本的不断更新、升级,无非是对bug的修复、新功能的增加、优化等,在JDK版本中,JDK1.8变得备受关注,也成了各大公司面试中常常被问及的话题。 一、JDK1.8优点概括 1、速度更快 由于底层结构和JVM的改变,使得JDK...

    jdk1.8.0_202.rar

    随JDK 1.8.0_202提供的“jdk-8u202-windows-x64最后一个不收费的jdk版本windows版.docx”文档,详细介绍了这个版本的特点、安装步骤和使用指南,对于初学者和开发者来说是一份宝贵的参考资料。 总结,JDK 1.8.0_202...

    JDK的三个安装包。。。

    Java 8是Java历史上的一个重要版本,引入了Lambda表达式、函数式编程概念、Stream API、新的日期和时间API等重大改进。对于开发者来说,了解这些新特性对于提高代码质量和效率至关重要。 2. jdk-8u162-windows-x64...

    jdk1.8.0-161

    JDK 1.8.0_161是Java 8的一个稳定版本,它提供了许多对开发者友好的特性,如Lambda表达式、Stream API等,同时也包含了安全修复和性能优化。通过持续的维护和更新,Oracle确保了开发者可以使用可靠、高效的开发环境...

    redis jar JDK1.6

    标题“redis jar JDK1.6”指的是在Java开发环境中,使用Redis作为缓存来实现Session共享,...同时,对于那些仍在使用JDK1.6和Tomcat6的老系统来说,这是一个升级Session管理策略的好方法,而无需进行大规模的代码重构。

    官方JDK1.6.26 X64(JDK1.6.26 64位)

    JDK1.6.26是Java平台标准版(Java SE)的一个版本,它包含了Java编译器、Java运行时环境、Java类库以及各种开发工具,如Javadoc和JConsole。在Java开发中,JDK扮演着核心角色,为程序员提供了编写、测试和调试Java...

    jdk1.8.0_91版本

    总之,JDK 1.8.0_91是Java 8的一个重要版本,其特性如Lambda表达式、Stream API和新的日期时间API极大地提升了Java的生产力和代码质量。在使用过程中,开发者应充分利用这些新特性,并关注版本的更新和安全维护。

    JDK1.8源码完整版

    Lambda表达式是JDK1.8的一个重要特性,它简化了对匿名内部类的使用,使得代码更加简洁和易读。通过使用 Lambda,我们可以将函数作为参数传递,或者将函数直接定义为方法体。这在处理集合操作时尤其有用,配合Stream ...

    jdk1.8.0_121

    `jdk1.8.0_121`版本是在Java 8发布后的一个更新,主要包含了bug修复、性能优化和安全更新。由于官方下载通道可能出现问题,提供此版本的下载链接是为了确保开发者能够获取到可靠的JDK安装包。 在使用这个版本的JDK...

Global site tag (gtag.js) - Google Analytics