`
chenlb
  • 浏览: 693402 次
  • 性别: 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 字符串索引越界异常(StringIndexOutBounds)

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

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

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

    抛出异常代码示例

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

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

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

    java 索引越界异常(IndexOutOfBoundsException)

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

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

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

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

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

    C/C++ 避免数组越界的方法

    C/C++ 避免数组越界的方法 C/C++ 中的数组越界是一种常见的错误,它可能会导致程序崩溃或破坏其他变量的数据。为了避免数组越界,程序员需要预先推断数组的大小和边界,并在访问数组时进行严格的边界检查。 首先...

    java 异常机制

    throws关键字用在方法签名中,以声明该方法可能会抛出的异常类型。finally块中的代码总是会被执行,无论是否发生异常,它通常用于执行清理工作,比如关闭文件或者释放资源。 异常主要分为两种类型:Error和...

    Java中常见的异常分析

    9. **字符串转换为数字异常:NumberFormatException** - 尝试将字符串转换为数值类型,但字符串格式不正确时,会抛出此异常。 10. **操作数据库异常:SQLException** - 处理数据库操作时,如查询、插入、更新或删除...

    实验五 Java异常处理实验.docx

    抛出异常是指程序中出现错误时,抛出异常对象,以便于捕获和处理异常。捕获异常是指使用 catch 语句捕获抛出的异常对象,并进行相应的处理。 实验代码 ```java class Example1 { static void method() { int a = ...

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

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

    JAVA异常详解.doc

    9. **字符串转换为数字异常**:`NumberFormatException` - 尝试将字符串转换为数字类型,但格式不正确时,会抛出此异常。 10. **操作数据库异常**:`SQLException` - 处理数据库相关操作时,如查询、插入、更新或...

    JAVA异常大全

    12. **方法未找到异常:NoSuchMethodException** - 当尝试调用一个不存在的方法时,会抛出此异常。 除了这些常见异常,Java还提供了一些其他类型的异常,如: 13. **AbstractMethodError** - 当应用程序试图调用一...

    java常见异常

    // 可能抛出异常的代码 } catch (Exception e) { // 处理异常 } finally { // 清理资源 } ``` #### 五、总结 了解并掌握Java中的异常处理机制对于编写高质量的代码至关重要。通过本文的介绍,我们不仅学习到了...

    java 异常种类总结【转】.docx

    NoSuchMethodException 是一种方法未找到异常,指的是在程序中尝试调用一个不存在的方法时抛出的异常。 13. java.lang.AbstractMethodError 抽象方法错误 java.lang.AbstractMethodError 是一种抽象方法错误,指的...

    数组越界异常

    用try…catch…finally写一个捕捉数组越界的异常例子。

    数组越界处理,Runtime处理,分类处理

    这种错误在运行时会抛出异常,如果不捕获并处理,程序将终止执行。 Java语言中,数组越界异常通常由`java.lang.ArrayIndexOutOfBoundsException`表示,这是`RuntimeException`的一个子类。在C++中,虽然不会自动抛...

Global site tag (gtag.js) - Google Analytics