使用indexOf提取URL协议的Java代码报错求助
代码问题分析及正确实现
现有代码的问题
- 硬编码覆盖输入参数:方法内直接把
url变量赋值为固定的https网址,完全忽略了传入的参数,测试用例可能传入的是http开头的URL,导致返回结果和预期不符。 - 协议起始位置逻辑错误:用
url.indexOf("https")获取协议起始位置,只适配https协议,遇到http、ftp等其他协议时,该方法会返回-1,调用substring会抛出StringIndexOutOfBoundsException。逻辑上协议是从URL开头(索引0)开始的,不需要查找特定协议字符串。 - 未处理非法URL情况:如果传入的URL不包含
://,endProtocol会是-1,此时调用substring会直接报错。
正确实现方式
public String getProtocol(String url) { // 处理空输入 if (url == null || url.isEmpty()) { return null; // 也可根据需求抛出IllegalArgumentException } int protocolEndIndex = url.indexOf("://"); // 检查是否存在协议分隔符 if (protocolEndIndex == -1) { return null; // 或返回空字符串,根据业务需求调整非法URL的处理逻辑 } // 从开头截取到://之前的部分,即为协议 return url.substring(0, protocolEndIndex); }
验证说明
传入"http://www.example.com"会返回"http",传入"ftp://ftp.example.org"会返回"ftp",传入无协议的非法URL"www.example.com"会返回null(可根据实际需求调整该场景的返回值)。
内容的提问来源于stack exchange,提问作者Tiffany Youse
相关产品推荐
相关产品推荐

