1. 程式人生 > >關於異常String out of range:-1及處理方案

關於異常String out of range:-1及處理方案

我今天處理日誌檔案,想從一萬多條日誌中提取 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;
我寫的程式碼如下:
  1. package com.floyd.myjava;
  2. import org.apache.hadoop.hive.ql.exec.UDF;
  3. publicclassGetSaleNameextends UDF {
  4. publicString evaluate
    (String url){
  5. if(url !=null){
  6. int index1 = url.indexOf("sale/");
  7. int index2 = url.indexOf('?');
  8. url = url.substring(index1 +5, index2);
  9. return url;
  10. }
  11. returnnull;
  12. }
  13. publicstaticvoid main(String[] args){
  14. String url ="http://cms.yhd.com/sale/IhSwTYNxnzS?tc=ad.0.0.15116-32638141.1&tp=1.1.708.0.3.LEHaQW1";
  15. GetSaleName
    gs =newGetSaleName();
  16. System.out.println(gs.evaluate(url));
  17. }
  18. }
jvm 測試時是可以通過的,但是我在執行 MapReduce 時報了一個RuntimeException ,大概是 String out of indexof range : -1; 我一開始很疑惑為什麼會報索引超出範圍,我明明寫了判斷,後來我發現,真的存在了一個很嚴重的問題,我寫的程式碼不夠嚴謹,如果字串中沒有 "sale/" or '?' 的時候, indexof 值為-1,所以彙報這個out of range 的異常, 於是我重新修改了我的程式碼。 eg:
  1. package
    com.floyd.myjava;
  2. import org.apache.hadoop.hive.ql.exec.UDF;
  3. publicclassGetSaleNameextends UDF {
  4. publicString evaluate(String url){
  5. if(url !=null){
  6.            // 新增一個 if 判斷條件
  7. if(url.indexOf("sale/")!=-1&& url.indexOf('?')!=-1
  8. && url.indexOf("sale/")< url.indexOf('?')){
  9. int index1 = url.indexOf("sale/");
  10. int index2 = url.indexOf('?');
  11. url = url.substring(index1 +5, index2);
  12. return url;
  13. }
  14. }
  15. returnnull;
  16. }
  17. publicstaticvoid main(String[] args){
  18. String url ="http://cms.yhd.com/sale/IhSwTYNxnzS?tc=ad.0.0.15116-32638141.1&tp=1.1.708.0.3.LEHaQW1";
  19. GetSaleName gs =newGetSaleName();
  20. System.out.println(gs.evaluate(url));
  21. }
  22. }
結果執行異常消除。