java commons lang 随机数_Apache Common-lang组件里随机数工具类RandomStringUtils的一个bug...

现在本文也转到了我自己的博客上,地址:月城小馆

Apache Common组件是java开发中常用的工具,其中的common-lang包是java基本数据类型的处理工具,包括数字、字符串、日期时间等多种工具类。

在org.apache.commons.lang包中有一个随机数工具类RandomStringUtils,它是根据指定的字符串数组生成给定长度的随机数的工具类。该累包含较多的方法,所有方法返回的都是随机数字符串。每个方法至少提供一个参数int count,这个参数表示要生成的随机数的长度,最后真正实现这个随机数生成过程的是下面这个方法:

publicstaticStringrandom(intcount,intstart,intend,

booleanletters,booleannumbers,char[] chars, Random random) {

if(count == 0)

return"";

if(count 

thrownewIllegalArgumentException(

"Requested random string length "+ count

+" is less than 0.");

}

if((start == 0) && (end == 0)) {

end = 123;

start = 32;

if((!(letters)) && (!(numbers))) {

start = 0;

end = 2147483647;

}

}

StringBuffer buffer =newStringBuffer();

intgap = end - start;

while(count-- != 0) {

charch;

if(chars ==null)

ch = (char) (random.nextInt(gap) + start);

else{

ch = chars[(random.nextInt(gap) + start)];

}

if(((letters) && (numbers) && (Character.isLetterOrDigit(ch)))

|| ((letters) && (Character.isLetter(ch)))

|| ((numbers) && (Character.isDigit(ch)))

|| ((!(letters)) && (!(numbers))))

buffer.append(ch);

else{

++count;

}

}

returnbuffer.toString();

}

其中的参数:

@paramcount表示要生成的随机数长度

@paramstart开始位置

@paramend结束位置

@paramletters是否包含字母

@paramnumbers是否包含数字

@paramchars指定的字符种子

@paramrandomRandom实例

看代码里面的逻辑很清楚了,别的参数不做讨论,只看chars这个参数。

(1)如果指定了这个参数,则生成的随机数只能包含这个数组里的字符(字符或者数字);

(2)如果没有指定这个数组,传进来的是null,则根据指定的start和end给出随机数,然后在后面的while循环里判断,见红色字体部分。

使用下面这个语句进行调用:

String strLen = RandomStringUtils.random(2, 6, 11, false, true);

这个语句最终调用的还是上面说的那个方法,执行时是死循环状态,问题就出在这里(2)的情况里,如果指定参数letters为false,参数numbers为true,指定的start和end在可见字符之外,比如start=6,end=11,则红色标志部分的代码判断一直为false,造成while进入死循环状态。

为避免这种情况产生,需要在传递参数时小心谨慎,给出合法的起止位置,最好给出字符串数组,指定该方法使用给定的字符生成随机数;或者对这个方法进行完善,定义自己的随机数工具类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初级测试开发面试题_初级开发人员在编写单元测试时常犯的错误

初级测试开发面试题自从我编写第一个单元测试以来已经有10年了。 从那时起,我不记得我已经编写了成千上万的单元测试。 老实说,我在源代码和测试代码之间没有任何区别。 对我来说是同一回事。 测试代码是源代码的一部分。 在过去的3-4年中,我…

java文件读写详细介绍_java文件读写操作大全

一.获得控制台用户输入的信息public String getInputMessage() throws IOException...{System.out.println("请输入您的命令∶");byte buffer[]new byte[1024];int countSystem.in.read(buffer);char[] chnew char[count-2];//最后两位为结束符,删去不要f…

使用SoapUI调用安全WCF SOAP服务–第1部分,该服务

在这个由三部分组成的传奇中,我将演示如何使用SoapUI API工具来调用安全的SOAP服务。 首先,我将专注于创建服务,在接下来的文章中它将充当被测系统。 使用基本身份验证传输安全性机制维护对该服务中资源的访问。 Windows Communication Foun…

java简单系统_Java简单学生管理系统

Java简单学生管理系统这个不需要手动输入,笔记记录//studentpublic class student(){private String id;//学号private String name;//姓名private int age;//年龄public String getId() {return id;}public void setId(String id) {this.id id;}public String get…

github和maven_在github上托管Maven存储库(包含源代码和javadoc)

github和maven如何通过maven使其他开发人员可以使用小型开源库? 一种方法是将其部署在Maven Central Repository上 。 我想要做的是将其部署到github ,因此我可以自由地对其进行修改。 这篇文章将告诉您如何做到这一点。 我将工件部署到github的典型方法…

kafka java编程demo_Kafka简单客户端编程实例

今天,我们给大家带来一篇如何利用Kafka的API进行客户端编程的文章,这篇文章很简单,就是利用Kafka的API创建一个生产者和消费者,生产者不断向Kafka写入消息,消费者则不断消费Kafka的消息。下面是具体的实例代码。一、创…

java我的世界极限生存_我的世界 1.7.10 极限生存整合包

整合包介绍:最近总有人觉得Minecraft很无聊,没有什么可玩的,或者觉得生存太简单 那么就来试试这个吧,全部是增强怪物的MOD,保证不无聊,保证不简单 基本上没有增加一些新的东西,只增加了几种怪物…

具有InlfuxDB的Spring Boot和Micrometer第1部分:基础项目

对于那些关注此博客的人来说,难怪我倾向于大量使用InfluxDB。 我喜欢这样一个事实,它是一个真正的单一用途的数据库(时间序列),具有许多功能,并且还带有企业支持。 Spring也是我选择的工具之一。 因此&…

Gradle善良:仅添加包装用于战争

我的同事Tom Wetjens 在Maven中撰写了博客文章仅打包依赖项 。 当我们想在WAR文件中包含依赖项时,他展示了一种Maven解决方案,而在其他任何作用域中都没有使用。 在这篇博客中,我们将看到我们如何在Gradle中解决这个问题。 假设我们在项目中…

java递归api_javaAPI_IO流基础_递归使用

IO流_递归1.递归概述递归指的是方法定义中调用自身方法的情况。2.递归的注意事项(1).要有出口,否则就是死递归(2).次数不能太多,否则就内存溢出(3).构造方法不能递归使用[不然在创建对象的时候就会内存溢出]3.递归解决问题的思想(1).分解法:把问题细分为…

PIT,JUnit 5和Gradle –仅需额外的一行配置

在Gradle(带有gradle-pitest-plugin 1.4.7)中发现简单,经过改进的PIT和JUnit 5配置。 不可否认,如今JUnit 5越来越受欢迎。 虽然为JUnit 5提供了一个专用于PIT的插件,并且gradle-pitest-plugin支持了很多年&#xff0…

apache camel_使用WildFly 8在Java EE7中自举Apache Camel

apache camel从Camel版本2.10开始,支持CDI(JSR-299)和DI(JSR-330)。 这为在Java EE容器中以及在独立的Java SE或CDI容器中开发和部署Apache Camel项目提供了新的机会。 是时候尝试一下并熟悉它了。 骆驼到底是什么&am…

python中可变参数怎么传递的呢_在python中,你可以在命名参数后传递可变参数吗?...

can you pass variadic arguments after named parameters?Python 3.4.3:答案是肯定的.如果要调用仅命名固定参数的函数,请将可变参数放在函数定义中def function(*args, bob, sally):print(args, bob, sally)values [1, 2, 3, 4]function(bob"Hi bob",…

Hibernate中保存与持久性以及saveOrUpdate之间的区别

保存与保存或更新与持久保存在Hibernate中 save和saveOrUpdate之间的区别是什么或save和persist之间的区别是任何Hibernate面试中常见的面试问题,就像Hibernate中get和load方法之间的区别一样。 Hibernate Session类提供了几种方法,可以通过诸如save&am…

java的log计算_Java普通对数(log)计算方法

Java给我提供的数学计算的工具类Math计算对数的函数有两个:/*** Returns the natural logarithm (base e) of a {code double}* value. Special cases:* If the argument is NaN or less than zero, then the result* is NaN.* If the argument is positive infinit…

javaee编程题_在JavaEE中使用CDI的简单面向方面的编程(AOP)

javaee编程题我们编写满足特定业务逻辑的服务API。 涵盖所有服务API(如安全性,日志记录,审核,度量延迟等)的跨领域问题很少。 这是一个重复的非业务代码,可以在其他方法之间重用。 重用的一种方法是将这些重…

java中的语句有哪些_java中的循环语句有哪些

Java中有三种主要的循环结构:while 循环do…while 循环for 循环顺序结构的程序语句只能被执行一次。如果您想要同样的操作执行多次,,就需要使用循环结构。一、while循环语法:while( 布尔表达式 ) {     //循环内容   }只要符合布尔表达…

使用自动伸缩组在AWS中运行安全数据库集群

当您必须在AWS上运行可伸缩应用程序时,您的数据库也必须可伸缩。 扩展无状态应用程序层更容易,在无状态应用程序层中,每个节点大部分都是可使用的-即使3节点集群中的一个节点发生故障,您也可以启动另一个节点,而没人注…

php无法新数据类型,新手入门PHP必知的七种数据类型

想要入门PHP,首先要学会搭建环境,其次是学习基础语法。PHP的基础包括数据类型,运算符,变量和常量等。在这篇文章中,我们主要了解什么是数据类型。数据类型是指同种数据的一个统称,一般会描述为XX数据类型。…

java batch_Java EE 7 Batch中传递属性/参数的2种方式

java batch谈到Java EE 7批处理功能,有两种方法可以将属性/参数传递给块和批处理。 本快速指南向您展示了两种方式,在开发批处理Java EE 7方式时可能会经常使用它们。 1.运行前预定义的属性/参数 预定义属性是您在部署应用程序之前定义的属性&#xff0…