写一段程序,删除字符串a中包含的字符串b,举例 输入a = "asdw",b = "sd" 返回 字符串 “aw”;一个容易被忽略的bug
代码如下: public class test{
public static void main(String args[]){
String test=test("sahsjkshabshwkiixab","");
System.out.println(test);
}
public static String test(String str,String targetstr) {
StringBuffer bf = new StringBuffer();
if (str==null||targetStr==null) {
return bf.toString();
}
if (str.length()>=targetstr.length()){
for(int i=0;i<str.length();i++){
if(i+targetstr.length()>str.length()){
bf.append(str.substring(i,str.length())); break;
}
if(!str.substring(i,i+targetstr.length()).equals(targetstr)){
bf.append(str.substring(i,i+1));
}
else{
i=i+targetstr.length()-1;
}
}
return bf.toString();
}
else {
bf.append(str);
return bf.toString();
} } }
本程序写完后,运行测试过程中,遇到一个有意思的问题,当输入字符串某个为null的时候,程序进入死循环,一直没执行完,后发现是因为判断条件 if (str==null||targetStr==null) 不生效导致;
为什么不生效呢????
因为楼主搞混了“”和null是有区别的,
1. null表示这个字符串不指向任何的东西,如果这时候你调用它的方法,那么就会出现空指针异常。
2.""表示它指向一个长度为0的字符串,这时候调用它的方法是安全的。
3. null不是对象,""是对象,所以null没有分配空间,""分配了空间,例如: String str1 = null; str引用为空 String str2 = ""; str应用一个空串
4,所以,判断一个字符串是否为空,首先就要确保他不是null,然后再判断他的长度。 String str = xxx; if(str != null && str.length() != 0) { }
另外考虑效率的问题:s.equals("") 慢于s.length() <= 0;而s.isEmpty()有可能不兼容;
所以此处最好将判断条件修改为 if (str==null||str.length()==0||targetstr==null||targetstr.length()==0)
写一段程序,删除字符串a中包含的字符串b,举例 输入a = "asdw",b = "sd" 返回 字符串 “aw”;一个容易被忽略的bug的更多相关文章
- 给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组
Array.prototype.removeCount=function(){ var that=this; var arr=[]; for(var i=0;i<that.length;i++) ...
- 用递归法判断字符串A中包含多少个字符串B
string类提供了判断字符串B在字符串A中首次(或最后)出现的Index的方法,但有时候需要判断B在A中出现了多少次. 为此想了一个算法. public static void CountIndex ...
- win8中写好的程序,在win7中没办法运行
没有安装相应版本的,net framework win8自带4.0 win7自带2.0 所以4.0及其以上的程序在win7跑必须安装4.0及其以上版本的framework
- python 面试题 删除字符串a中包含的字符串b
- 删除log日志中包含某个字符的行
sed -i '/{Str}/d' abc.txt 假如你的log日志中某行有sleep字符,直接输入命令: sed -i '/sleep/d' log.log 如果删除的是一个变量的值,假如是var ...
- 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 写给后端程序员的HTTP缓存原理介绍
There are only two hard things in Computer Science: cache invalidation and naming things. -- Phil Ka ...
- sbt打包Scala写的Spark程序,打包正常,提交运行时提示找不到对应的类
sbt打包Scala写的Spark程序,打包正常,提交运行时提示找不到对应的类 详述 使用sbt对写的Spark程序打包,过程中没有问题 spark-submit提交jar包运行提示找不到对应的类 解 ...
- Java 处理json字符串value中多余的双引号
转: Java 处理json字符串value中多余的双引号 一.错误场景 json字符串的value值中有多余的双引号 1.直接上错误的json字符串 1 String errorJsonStr = ...
随机推荐
- LinkedHashSet有没有重复的元素
1.LinkedHashSet 的概述和使用 llinkedHashSet 的特点: 是唯一能保证怎么存就怎么输出的 set 集合,并且去重复 1 LinkedHashSet<String& ...
- C#多线程那点事——信号量(Semaphore)
信号量说简单点就是为了线程同步,或者说是为了限制线程能运行的数量. 那它又是怎么限制线程的数量的哩?是因为它内部有个计数器,比如你想限制最多5个线程运行,那么这个计数器的值就会被设置成5,如果一个线程 ...
- turtle1
#画风车 from turtle import * pensize(2) for i in range(4): seth(360-i*90) fd(150) rt(90) circle(-150,45 ...
- IDEA中MavenWeb项目没有新建servlet文件
解决方案: https://blog.csdn.net/Delicious_Life/article/details/89515363
- C++用new与不用new创建对象的区别
C++创建对象 一.Alignment问题 重新发现这个问题是因为在体系结构课上提到的一个概念,alignment对齐的概念. class MyClass { public : char c; // ...
- Tkint中Label&Button&Scale的使用
top.geometry()设定窗口的初始大小 scale.set()设定滑块的初始值 scale.get()获取滑块变化的值 控件通过回调函数与其他控件进行通信(Label控件中的文本会受到Scal ...
- javaweb之添加学生信息
1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母.数字组成.(1分) 3性别:要求用单选框或下拉框 ...
- Java自学-数组 复制数组
Java 如何复制数组 数组的长度是不可变的,一旦分配好空间,是多长,就多长,不能增加也不能减少 步骤 1 : 复制数组 把一个数组的值,复制到另一个数组中 System.arraycopy(src, ...
- JAVA案例练习: 去除ArrayList中重复的字符串(字符串内容相同),去除重复的对象
package com.yqw.list; import java.util.ArrayList;import java.util.Iterator; public class Demo_ArrayL ...
- Linux下which、whereis、locate、find命令作用
1 which 查看可执行文件的位置,也可以找到命令别名 2 whereis 查看文件的位置 3 locate 系统数据库查找文件位置,数据库大约每天更新一次 4 find 根据查找条件,搜寻硬盘查询 ...