IllegalArgumentException - Google Guava将String转换为HashMap

时间:2014-11-13 13:45:51

标签: java guava

我正在尝试将以下字符串转换为HashMap,因为它具有键值对:

0,2343:1,ORDER:4,Name:5,:6,:7,London:8,null:9,postcode:10,Field 1:11,Fake Place:13,:14,:15,:16,null:17,postcode:18,0208 1192000:20,Field 1:23,1:24,19700101:25,ORDNO90654:38,Fake Company:50,GB:68,null:69,0:70,1:75,KGS:21,0:79,null null GBR null null:80,GB:1222,null:21-2,0:79-2,null null GBR null null:80-2,GB:1222-2,null:112,0:116,0:119,10200:190,N:99,:

我正在使用Google的Guava库在名为FlightProcessorTest的单元测试中执行此操作:

Map<String, String> messageMap = Splitter.on(",")
            .withKeyValueSeparator(":")
            .split(keyValueSplit);

但是,我得到以下例外:

java.lang.IllegalArgumentException: Chunk [0] is not a valid entry
    at com.google.common.base.Preconditions.checkArgument(Preconditions.java:145)
    at com.google.common.base.Splitter$MapSplitter.split(Splitter.java:508)
    at com.xxxx.test.FlightProcessorTest.testProcessMessage(FlightProcessorTest.java:180)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310)
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:88)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:96)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:118)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:104)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:53)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

2 个答案:

答案 0 :(得分:3)

问题出在解析后的字符串的开头:     0,2343:1

您使用Splitter.on(“,”)。withKeyValueSeparator(“:”),因此第一个值是未知的。

我会看到更多失败的地方 - 例如:

postcode:18,0208 1192000:20,

答案 1 :(得分:1)

您可以尝试使用(?<= )后面的正则表达式来识别值。 这里“:”后跟数字。或者(?<=\\:[^,:]+)

Map<String, String> messageMap = Splitter.onPattern("(?<=\\:\\d+),")
        .withKeyValueSeparator(":")
        .split(keyValueSplit);

(我无法尝试。)