用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在检测到错误时自动创建并抛出的,开发者无法控制何时发生。 手动抛出异常则是根据业务逻辑或特定条件决定...
在编程中,“抛出异常”是一种常见的错误处理机制,用于在程序执行过程中遇到不可预见的情况时中断正常流程,并提供有关错误的信息。通过这样的机制,程序员可以更好地控制程序的执行流程,确保程序在出现问题时能够...
day05_11_常见问题_数组索引越界异常
4. **替换操作**:在`String`的`replace()`或`replaceFirst()`等方法中,如果提供的索引超出范围,也会抛出异常。 解决此类问题通常需要检查代码中所有涉及字符串索引的操作,确保它们都在合法范围内。使用`length...
` 这会尝试访问不存在的第六个元素,因此抛出异常。 2. **集合操作**:在ArrayList、LinkedList等集合类中,如果尝试通过索引获取、删除或添加元素时,如果索引超出实际元素范围,也会抛出该异常。例如:`ArrayList...
本文将详细介绍如何在Android中自定义抛出异常,并探讨其背后的机制和优势。 首先,我们要理解`throw`和`throws`在Java(包括Android)中的区别。`throw`关键字用于在代码中主动抛出一个具体的异常实例,例如: ``...
// 可能抛出异常的代码 } catch (ArrayIndexOutOfBoundsException e) { System.out.println("数组下标越界,错误信息:" + e.getMessage()); } ``` 2. **边界检查**:在访问数组元素前,检查索引是否在合法范围内...
C/C++ 避免数组越界的方法 C/C++ 中的数组越界是一种常见的错误,它可能会导致程序崩溃或破坏其他变量的数据。为了避免数组越界,程序员需要预先推断数组的大小和边界,并在访问数组时进行严格的边界检查。 首先...
throws关键字用在方法签名中,以声明该方法可能会抛出的异常类型。finally块中的代码总是会被执行,无论是否发生异常,它通常用于执行清理工作,比如关闭文件或者释放资源。 异常主要分为两种类型:Error和...
9. **字符串转换为数字异常:NumberFormatException** - 尝试将字符串转换为数值类型,但字符串格式不正确时,会抛出此异常。 10. **操作数据库异常:SQLException** - 处理数据库操作时,如查询、插入、更新或删除...
“数组越界”错误是Java编程语言中常见的异常类型,表明程序试图访问数组的一个不存在的元素,即下标超出数组边界。在Hive中,这可能源于Hive执行引擎或ORC读写库的问题。在描述中提到的解决方案是替换相关的jar包,...
抛出异常是指程序中出现错误时,抛出异常对象,以便于捕获和处理异常。捕获异常是指使用 catch 语句捕获抛出的异常对象,并进行相应的处理。 实验代码 ```java class Example1 { static void method() { int a = ...
9. **字符串转换为数字异常**:`NumberFormatException` - 尝试将字符串转换为数字类型,但格式不正确时,会抛出此异常。 10. **操作数据库异常**:`SQLException` - 处理数据库相关操作时,如查询、插入、更新或...
12. **方法未找到异常:NoSuchMethodException** - 当尝试调用一个不存在的方法时,会抛出此异常。 除了这些常见异常,Java还提供了一些其他类型的异常,如: 13. **AbstractMethodError** - 当应用程序试图调用一...
// 可能抛出异常的代码 } catch (Exception e) { // 处理异常 } finally { // 清理资源 } ``` #### 五、总结 了解并掌握Java中的异常处理机制对于编写高质量的代码至关重要。通过本文的介绍,我们不仅学习到了...
NoSuchMethodException 是一种方法未找到异常,指的是在程序中尝试调用一个不存在的方法时抛出的异常。 13. java.lang.AbstractMethodError 抽象方法错误 java.lang.AbstractMethodError 是一种抽象方法错误,指的...
用try…catch…finally写一个捕捉数组越界的异常例子。
这种错误在运行时会抛出异常,如果不捕获并处理,程序将终止执行。 Java语言中,数组越界异常通常由`java.lang.ArrayIndexOutOfBoundsException`表示,这是`RuntimeException`的一个子类。在C++中,虽然不会自动抛...