2013-10-25 59 views
0

所以解決空字符串,我在下面的格式期待我的數據:在Java

"domain::foo::127" 

因此,這裏是我的代碼:

String[] typeChunks = input.split("::"); 

      String type = typeChunks[0]; 
      String edge = typeChunks[1]; 

      double reputation = Double.parseDouble(typeChunks[2].trim()); 

但我得到這個eror

  java.lang.NumberFormatException: empty String 
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1011) 
at java.lang.Double.parseDouble(Double.java:540) 
at org.attempt2.BuildGraph$ReduceClass.reduce(BuildGraph.java:94) 
at org.attempt2.BuildGraph$ReduceClass.reduce(BuildGraph.java:1) 
at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:176) 
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:650) 
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:418) 
at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Subject.java:415) 
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1136) 
at org.apache.hadoop.mapred.Child.main(Child.java:249) 

什麼是處理這個問題的好方法?

+0

用正則表達式匹配每個組可能會更好。 –

回答

1

您需要處理您有錯誤數據的情況。這不完全是一個詳盡的驗證,但它可能是一個起點:

String[] format = "domain::foo::127".split("::"); 

... 

boolean validateFormat(String[] format) { 
    // Check for anything that you don't want coming through as data 
    return format.length == 3; 
} 
0

使用String[] typeChunks = input.split("::");if (!input.equals("")){,不要忘記關閉}

0

您可以驗證之前解析字符串值:

double reputation = (typeChunks[2].trim() != null && 
        !typeChunks[2].trim().isEmpty()) ? 
        Double.parseDouble(typeChunks[2].trim()) : 0; 
+1

一般來說,不是通過返回一個'0'來默默地失敗,而應該考慮拋出一個'Exception'。這樣你可以決定什麼是最適合處理這個問題的。 (通知用戶,使用默認值,日誌等) – TheMorph

0

錯誤消息是由於處理空數據造成的。

double reputation = 0; 
final String reputStr = typeChunks[2]; 
if ((reputStr != null) && !("").equals(reputStr.trim())) 
{ 
    reputation = Double.parseDouble(typeChunks[2].trim()); 
} 
2

除了應該在使用數據之前,沒有一種單一的好方法來驗證數據。我建議使用Scanner作爲整體解析您的數據字符串,而不是將您的數據字符串拆分,然後單獨將它們轉換爲正確的數據類型,這樣可以爲您提供類型安全性。

Double reputation = null; 
String type = null, edge = null; 

String dataString = "domain::foo::127"; 
Scanner scanner = new Scanner(dataString).useDelimiter("::"); 

if (scanner.hasNext()) { 
    type = scanner.next(); 
} else 
    throw new IllegalArgumentException("Type not found!"); 
if (scanner.hasNext()) { 
    edge = scanner.next(); 
} else 
    throw new IllegalArgumentException("Edge not found!"); 
if (scanner.hasNextDouble()) { 
    reputation = scanner.nextDouble(); 
} else 
    throw new IllegalArgumentException("Reputation not found!"); 

System.out.println(type); // domain 
System.out.println(edge); // foo 
System.out.println(reputation); // 127.0 


同樣好的辦法是要測試的正則表達式的完整數據串(如果它不如願長),但有可能失去對信息的成本到底哪個數據單元驗證失敗。

Pattern pattern = Pattern.compile("(\\w+)::(\\w+)::(\\d+)"); 
Matcher matcher = pattern.matcher(dataString); 

if (matcher.matches()) { 
    type = matcher.group(1); 
    edge = matcher.group(2); 
    reputation = Double.valueOf(matcher.group(3)); 
} else 
    throw new IllegalArgumentException("Invalid input data"); 
1

使用正則表達式,您可以驗證輸入字符串是否有效!

String pattern = "[a-z]+::{1}[a-z]+::{1}[0-9]+(\\.[0-9][0-9]?)?"; 

String type, edge; 
double reputation; 

if(input.matches(pattern)){ 
    String[] typeChunks = input.split("::"); 
    type = typeChunks[0]; 
    edge = typeChunks[1]; 
    reputation = Double.parseDouble(typeChunks[2].trim()); 
} 
else 
    throw new IllegalArgumentException(); 

此正則表達式將檢查

  1. 字母型
  2. 字母邊緣
  3. 數字聲譽帶或不帶小數點
  4. 「::」 三個
0

之間怎麼樣創建一個簡單的助手類來檢查你的字符串...像

public class StringUtil {

public static boolean isNullOrEmpty(final String string)

{
return string == null || string.isEmpty() || string.trim().isEmpty();

}

}

所以在這種方式通過Y你不需要使用trim()。因爲如果你對一個空字符串使用trim(),你會得到一個異常。但是您仍然必須處理Double.parseDouble中的NumberFormatException。

所以,如果你不想添加try和catch塊,每次你可以爲Double.parseDouble創建一個簡單的包裝來捕獲異常並以你的方式處理它們(比方說返回-1)。

double reputation = StringUtil.isNullOrEmpty(typeChunks[2])== true ? 0 : YourClass.methodToParseDoubleAndHandleException(typeChunks[2]);

+0

我喜歡這種方法,你總是控制你的結果 – Anton