您的位置:首页 > 其它

关于异常String out of range:-1及处理方案

2017-05-12 17:11 621 查看
我今天处理日志文件,想从一万多条日志中提取 url 里面的销售 ID;
如:http://cms.yhd.com/sale/IhSwTYNxnzS?tc=ad.0.0.15116-32638141.1&tp=1.1.708.0.3.LEHaQW1中取出 sale/ 后面的字符串IhSwTYNxnzS;

但是在运行 hive UDF 时出现了一个 Error :
String out of indexof range: -1;

我写的代码如下:

package com.floyd.myjava;



import org.apache.hadoop.hive.ql.exec.UDF;



public class GetSaleName extends UDF {



public String evaluate(String url) {

if (url != null) {

int index1 = url.indexOf("sale/");

int index2 = url.indexOf('?');

url = url.substring(index1 + 5, index2);


return url;
}

return null;

}



public static void main(String[] args) {

String url = "http://cms.yhd.com/sale/IhSwTYNxnzS?tc=ad.0.0.15116-32638141.1&tp=1.1.708.0.3.LEHaQW1";

GetSaleName gs = new GetSaleName();

System.out.println(gs.evaluate(url));

}

}


jvm 测试时是可以通过的,但是我在运行 MapReduce 时报了一个RuntimeException ,大概是 String out of indexof range : -1;

我一开始很疑惑为什么会报索引超出范围,我明明写了判断,后来我发现,真的存在了一个很严重的问题,我写的代码不够严谨,如果字符串中没有 "sale/" or '?' 的时候, indexof 值为-1,所以汇报这个out of range 的异常, 于是我重新修改了我的代码。
eg:

package com.floyd.myjava;



import org.apache.hadoop.hive.ql.exec.UDF;



public class GetSaleName extends UDF {



public String evaluate(String url) {

if (url != null) {

           // 添加一个 if 判断条件

if (url.indexOf("sale/") != -1 && url.indexOf('?') != -1

&& url.indexOf("sale/") < url.indexOf('?')) {

	int index1 = url.indexOf("sale/");

	int index2 = url.indexOf('?');

	url = url.substring(index1 + 5, index2);



return url;

}

}

return null;

}



public static void main(String[] args) {

String url = "http://cms.yhd.com/sale/IhSwTYNxnzS?tc=ad.0.0.15116-32638141.1&tp=1.1.708.0.3.LEHaQW1";

GetSaleName gs = new GetSaleName();

System.out.println(gs.evaluate(url));

}

}


结果运行异常消除。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐