为何Integer.parseInt方法无法处理String.split分割后的字符串?
解决String.split提取数字时的NumberFormatException问题
我来帮你搞定这个报错!咱们先拆解下问题出在哪:
当你执行g.split("hi")处理字符串"hi5hi6"时,拆分出来的数组其实是["", "5", "6"],而不是你预期的["5", "6"]。这是因为原字符串开头就是分隔符"hi",split方法会把分隔符前面的空内容也作为数组的第一个元素保留下来。当你尝试对这个空字符串调用Integer.parseInt(k)时,就会触发NumberFormatException——毕竟空字符串没法转成整数嘛。
下面给你几个可行的解决方案:
方案1:过滤空字符串后再转换
在循环里先判断当前字符串是否为空,跳过空元素再执行转换:
String g = "hi5hi6"; String[] l = g.split("hi"); for (String k : l) { if (!k.isEmpty()) { // 跳过空字符串 int p = Integer.parseInt(k); System.out.println(p); } }
这个方法简单直接,适合格式相对固定的场景。
方案2:用正则表达式直接提取数字(更通用)
如果你的字符串格式可能变化,推荐直接用正则匹配所有数字,这样不管数字前后是什么内容,都能准确提取:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String g = "hi5hi6"; // 匹配一个或多个数字的正则表达式 Pattern pattern = Pattern.compile("\\d+"); Matcher matcher = pattern.matcher(g); // 遍历所有匹配到的数字 while (matcher.find()) { int p = Integer.parseInt(matcher.group()); System.out.println(p); } } }
这种方法适用性更广,比如如果字符串变成"abc123def45"也能正常提取数字。
方案3:跳过数组的第一个元素
如果你确定原字符串一定以"hi"开头,也可以直接从数组的索引1开始遍历,跳过第一个空元素:
String g = "hi5hi6"; String[] l = g.split("hi"); // 从索引1开始遍历,跳过第一个空元素 for (int i = 1; i < l.length; i++) { int p = Integer.parseInt(l[i]); System.out.println(p); }
不过这个方法局限性大,如果字符串开头没有"hi",就会漏掉第一个有效数字,谨慎使用。
内容的提问来源于stack exchange,提问作者fmatt
相关产品推荐
相关产品推荐

