You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于substring方法的误解及Java读取文件生成邮箱数组的代码问题

关于Java中substring()方法的清晰解释(适配邮箱解析场景)

嗨,我来帮你把substring()的用法掰扯明白,刚好适配你现在读取邮箱的场景~

首先得明确,Java的String类有两个常用的substring()重载方法,很多人踩坑都是没搞清楚它们的参数含义:

1. 两个重载方法的核心区别

  • substring(int beginIndex):从参数指定的索引位置开始,截取字符串到末尾。记住Java的字符串索引是从0开始的哦!比如"hello@example.com".substring(5)会得到"@example.com"。
  • substring(int beginIndex, int endIndex):这个是最容易误解的版本——它从beginIndex开始截取,但不会包含endIndex位置的字符,实际截取的长度是endIndex - beginIndex。比如"hello@example.com".substring(0,5)会得到"hello",而不是"hello@"。

2. 结合你的邮箱解析场景举例子

假设你读取的文件每行格式是序号:邮箱地址(比如1:martin@test.com),那提取邮箱的正确写法应该是这样:

// 假设在你的循环里读取每行内容
String line = infile.nextLine();
// 先找到冒号的位置
int colonPos = line.indexOf(':');
// 一定要判断是否找到冒号,避免indexOf返回-1导致索引越界
if (colonPos != -1) {
    // 从冒号的下一个位置开始截取到末尾,就是邮箱地址
    String email = line.substring(colonPos + 1).trim();
    array[index] = new EMail(email);
} else {
    // 处理格式错误的行,给个提示或者跳过
    JOptionPane.showMessageDialog(null, "第" + (index+1) + "行格式无效,无法提取邮箱");
}

如果你的文件里邮箱被其他字符包裹(比如[martin@test.com]),那就要用到双参数的substring():

String line = "[martin@test.com]";
// 从索引1开始,到字符串长度减1的位置结束(因为最后一个字符是],索引是line.length()-1)
String email = line.substring(1, line.length() - 1);
// 得到的就是martin@test.com

3. 常见误区避坑

  • 别搞反endIndex的含义:它是「结束位置的下一个索引」,不是最后一个要截取的字符的索引。比如你想取索引2到4的字符(包含),那应该写substring(2,5),而不是substring(2,4)。
  • 提前判断索引合法性:如果beginIndex小于0、endIndex大于字符串长度,或者beginIndex >= endIndex,都会抛出StringIndexOutOfBoundsException。所以用indexOf()找目标字符后,一定要先检查返回值不是-1再调用substring()。

希望这些解释能帮你理清误解,顺利完成邮箱数组的读取~

内容的提问来源于stack exchange,提问作者Martin Williams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:53:29