用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));
}
分享到:
相关推荐
求子串是从主串中找出一个连续的子序列作为新的串的过程。在实际应用中,求子串操作非常常见,例如在文本搜索、模式匹配等场景中。 在给定的部分内容中,使用了定长顺序存储的方式来实现求子串的功能。具体步骤如下...
(5)自动VS手动 自动抛出异常通常是由于违反了语言或库的规则,例如除以零、数组越界等。这些异常是由JVM在检测到错误时自动创建并抛出的,开发者无法控制何时发生。 手动抛出异常则是根据业务逻辑或特定条件决定...
Java运行时环境在遇到此类异常时,会立即停止当前线程的执行,并抛出异常。处理数组越界异常,主要有以下几种方法: ### 方法一:检查索引是否在有效范围内 这是一种预防性措施,通过提前判断索引是否在数组的有效...
在编程中,“抛出异常”是一种常见的错误处理机制,用于在程序执行过程中遇到不可预见的情况时中断正常流程,并提供有关错误的信息。通过这样的机制,程序员可以更好地控制程序的执行流程,确保程序在出现问题时能够...
day05_11_常见问题_数组索引越界异常
4. **替换操作**:在`String`的`replace()`或`replaceFirst()`等方法中,如果提供的索引超出范围,也会抛出异常。 解决此类问题通常需要检查代码中所有涉及字符串索引的操作,确保它们都在合法范围内。使用`length...
` 这会尝试访问不存在的第六个元素,因此抛出异常。 2. **集合操作**:在ArrayList、LinkedList等集合类中,如果尝试通过索引获取、删除或添加元素时,如果索引超出实际元素范围,也会抛出该异常。例如:`ArrayList...
比如在Java中,如果访问了一个不存在的索引,就会抛出ArrayIndexOutOfBoundsException。为了解决数组越界异常,可以采取以下几种方法。 首先,在访问数组元素之前,务必检查索引是否在数组的有效范围内。这需要保证...
在Python中,当索引越界异常发生时,程序会抛出`IndexError`,如果不进行处理,程序将终止执行并显示出错信息。为了避免这种情况,可以使用`try-except`语句来捕获并处理异常。在`try`块中编写可能引发`IndexError`...
本文将详细介绍如何在Android中自定义抛出异常,并探讨其背后的机制和优势。 首先,我们要理解`throw`和`throws`在Java(包括Android)中的区别。`throw`关键字用于在代码中主动抛出一个具体的异常实例,例如: ``...
在Java编程语言中,当索引越界异常发生时,Java运行时会抛出`IndexOutOfBoundsException`。该异常是一种未检查的异常,意味着编译器不会强制要求程序员捕获或处理这种异常。然而,在实际开发中,处理索引越界异常是...
// 可能抛出异常的代码 } catch (ArrayIndexOutOfBoundsException e) { System.out.println("数组下标越界,错误信息:" + e.getMessage()); } ``` 2. **边界检查**:在访问数组元素前,检查索引是否在合法范围内...
此外,代码中还展示了异常处理的正确写法,即先检查潜在的错误条件,再在条件不成立时抛出异常,最后在外部通过异常处理来捕获和响应异常。这对于编写出更稳定、容错性更强的程序代码至关重要。 最后,在代码测试中...
“数组越界”错误是Java编程语言中常见的异常类型,表明程序试图访问数组的一个不存在的元素,即下标超出数组边界。在Hive中,这可能源于Hive执行引擎或ORC读写库的问题。在描述中提到的解决方案是替换相关的jar包,...