0

したがって、次の形式のデータを期待しています。

"domain::foo::127"

だからここに私のコードがあります:

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

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

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

しかし、私はこのエラーを取得します

            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)

これを処理する良い方法は何ですか?

4

7 に答える 7

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. "::" 3 つすべての間
于 2013-10-25T00:45:40.097 に答える
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;
}
于 2013-10-25T00:06:52.787 に答える
0

if (!input.equals("")){前に使用 しString[] typeChunks = input.split("::");、閉じることを忘れないでください }

于 2013-10-25T00:10:42.227 に答える
0

文字列値を解析する前に検証できます。

double reputation = (typeChunks[2].trim() != null && 
                    !typeChunks[2].trim().isEmpty()) ? 
                     Double.parseDouble(typeChunks[2].trim()) : 0;
于 2013-10-25T00:10:43.300 に答える
0

エラー メッセージは、空のデータの処理によるものです。

double reputation = 0;
final String reputStr = typeChunks[2];
if ((reputStr != null) && !("").equals(reputStr.trim()))
{
   reputation = Double.parseDouble(typeChunks[2].trim());
}
于 2013-10-25T00:18:24.200 に答える
0

文字列をチェックするための単純なヘルパークラスを作成するのはどうですか...のようなもの

public class StringUtil {

public static boolean isNullOrEmpty(final String string)

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

}

}

したがって、この方法では、trim() を使用する必要はありません。空の文字列に対して trim() を使用すると、例外が発生するためです。ただし、Double.parseDouble で NumberFormatException を処理する必要があります。

したがって、毎回 try および catch ブロックを追加したくない場合は、Double.parseDouble の単純なラッパーを作成して、例外をキャッチし、それらを自分の方法で処理することができます (たとえば、return -1 としましょう)。

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

于 2013-10-25T01:09:05.090 に答える