`
chenlb
  • 浏览: 700292 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

不抛出越界异常的求子串方法

阅读更多

   用String.substring方法,不小心会有越界异常。现实现一个没抛出越界异常,越界就返回null,不过直接返回的再用其它方法,可能有Null异常。现还实现可以负index的,可能逆向的。

package com.chenlb.util;

public class StringUtil {
	
	/**
	 * start与end均可负数<br/>
	 * start < end正向取, start > end逆向取<br/>
	 * 示例:str="I am chenlb"<br/>
	 * StringUtil.substring(str, 0, 12) -> null<br/>
	 * StringUtil.substring(str, 12, 12) -> null<br/>
	 * StringUtil.substring(str, 12, 13) -> null<br/>
	 * StringUtil.substring(str, 4, 4) -> ""<br/>
	 * StringUtil.substring(str, 0, 4) -> "I am"<br/>
	 * StringUtil.substring(str, -4, -1) -> "enl"<br/>
	 * StringUtil.substring(str, -2, 4) -> "lbI am"<br/>
	 * StringUtil.substring(str, 4, 0) -> "ma I"<br/>
	 * StringUtil.substring(str, -1, -4) -> "lne"<br/>
	 * StringUtil.substring(str, 1, -4) -> "Iblne"<br/>
	 * StringUtil.substring(str, 0, -4) -> "blne"<br/>
	 * StringUtil.substring(str, -4, 0) -> "enlb"<br/>
	 * @return 越界返回null, start==end返回空
	 * @author chenlb 2008-6-18 下午12:39:51
	 */
	public static String substring(String str, int start, int end) {
		if(str == null) {
			return null;
		}
		int len = str.length();
		if(Math.abs(start) >= len) {
			return null;
		}
		if(Math.abs(end) > len) {
			return null;
		}
		StringBuilder sb = new StringBuilder();
		if(end > start) {	//正向
			substring(sb, str, start, end);
		} else if(end == start) {
			return "";
		} else {	//逆向 end < start
			substring(sb, str, end, start);
			sb.reverse();
		}
		return sb.toString();
	}
	
	private static void substring(StringBuilder sb, String str, int start, int end) {
		int len = str.length();
		if(start < 0) {
			if(end < 0) {
				sb.append(str.substring(len+start, len+end));
			} else {
				sb.append(str.substring(len+start, len));
				sb.append(str.substring(0, end));
			}
		} else {
			sb.append(str.substring(start, end));
		}
	}
}

 

测试代码:

public void testSubstring() {
		String str = "I am chenlb";
		
		assertEquals(null, StringUtil.substring(str, 0, 12));
		assertEquals(null, StringUtil.substring(str, 12, 12));
		assertEquals(null, StringUtil.substring(str, 12, 13));
		
		assertEquals("", StringUtil.substring(str, 4, 4));
		
		assertEquals("I am", StringUtil.substring(str, 0, 4));
		assertEquals("am", StringUtil.substring(str, 2, 4));
		assertEquals("I am chenlb", StringUtil.substring(str, 0, 11));
		
		assertEquals("enl", StringUtil.substring(str, -4, -1));
		assertEquals("lbI am", StringUtil.substring(str, -2, 4));
		
		assertEquals("ma I", StringUtil.substring(str, 4, 0));
		assertEquals("lne", StringUtil.substring(str, -1, -4));
		assertEquals("Iblne", StringUtil.substring(str, 1, -4));
		
		assertEquals("blne", StringUtil.substring(str, 0, -4));
		assertEquals("enlb", StringUtil.substring(str, -4, 0));
	}

 

分享到:
评论

相关推荐

    数据结构求子串

    求子串是从主串中找出一个连续的子序列作为新的串的过程。在实际应用中,求子串操作非常常见,例如在文本搜索、模式匹配等场景中。 在给定的部分内容中,使用了定长顺序存储的方式来实现求子串的功能。具体步骤如下...

    Java异常处理-throw手动抛出异常对象

    (5)自动VS手动 自动抛出异常通常是由于违反了语言或库的规则,例如除以零、数组越界等。这些异常是由JVM在检测到错误时自动创建并抛出的,开发者无法控制何时发生。 手动抛出异常则是根据业务逻辑或特定条件决定...

    数组越界异常(解决方案).md

    Java运行时环境在遇到此类异常时,会立即停止当前线程的执行,并抛出异常。处理数组越界异常,主要有以下几种方法: ### 方法一:检查索引是否在有效范围内 这是一种预防性措施,通过提前判断索引是否在数组的有效...

    抛出异常代码示例

    在编程中,“抛出异常”是一种常见的错误处理机制,用于在程序执行过程中遇到不可预见的情况时中断正常流程,并提供有关错误的信息。通过这样的机制,程序员可以更好地控制程序的执行流程,确保程序在出现问题时能够...

    day05 11 常见问题 数组索引越界异常

    day05_11_常见问题_数组索引越界异常

    java 字符串索引越界异常(StringIndexOutBounds)

    4. **替换操作**:在`String`的`replace()`或`replaceFirst()`等方法中,如果提供的索引超出范围,也会抛出异常。 解决此类问题通常需要检查代码中所有涉及字符串索引的操作,确保它们都在合法范围内。使用`length...

    java 索引越界异常(IndexOutOfBoundsException)

    ` 这会尝试访问不存在的第六个元素,因此抛出异常。 2. **集合操作**:在ArrayList、LinkedList等集合类中,如果尝试通过索引获取、删除或添加元素时,如果索引超出实际元素范围,也会抛出该异常。例如:`ArrayList...

    数组越界异常解决办法.md

    比如在Java中,如果访问了一个不存在的索引,就会抛出ArrayIndexOutOfBoundsException。为了解决数组越界异常,可以采取以下几种方法。 首先,在访问数组元素之前,务必检查索引是否在数组的有效范围内。这需要保证...

    索引越界异常解决办法.md

    在Python中,当索引越界异常发生时,程序会抛出`IndexError`,如果不进行处理,程序将终止执行并显示出错信息。为了避免这种情况,可以使用`try-except`语句来捕获并处理异常。在`try`块中编写可能引发`IndexError`...

    Android自定义抛出异常的方法详解

    本文将详细介绍如何在Android中自定义抛出异常,并探讨其背后的机制和优势。 首先,我们要理解`throw`和`throws`在Java(包括Android)中的区别。`throw`关键字用于在代码中主动抛出一个具体的异常实例,例如: ``...

    索引越界异常(解决方案).md

    在Java编程语言中,当索引越界异常发生时,Java运行时会抛出`IndexOutOfBoundsException`。该异常是一种未检查的异常,意味着编译器不会强制要求程序员捕获或处理这种异常。然而,在实际开发中,处理索引越界异常是...

    java 数组下标越界异常(ArrayIndexOutOfBoundsException)

    // 可能抛出异常的代码 } catch (ArrayIndexOutOfBoundsException e) { System.out.println("数组下标越界,错误信息:" + e.getMessage()); } ``` 2. **边界检查**:在访问数组元素前,检查索引是否在合法范围内...

    索引越界异常如何解决.md

    此外,代码中还展示了异常处理的正确写法,即先检查潜在的错误条件,再在条件不成立时抛出异常,最后在外部通过异常处理来捕获和响应异常。这对于编写出更稳定、容错性更强的程序代码至关重要。 最后,在代码测试中...

    hive2.1.1中orc格式读取报数组越界错误解决方法

    “数组越界”错误是Java编程语言中常见的异常类型,表明程序试图访问数组的一个不存在的元素,即下标超出数组边界。在Hive中,这可能源于Hive执行引擎或ORC读写库的问题。在描述中提到的解决方案是替换相关的jar包,...

Global site tag (gtag.js) - Google Analytics