java.lang.IndexOutOfBoundsException - 使用 Protocol buffer 构建 Java 对象时

java.lang.IndexOutOfBoundsException - when building Java Object using Protocol buffer

我正在使用 Protobuff 来构建我的 Java 对象,为什么在我的代码中调用 setHeader(0, h1) 时总是出现 java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 异常。

这是我的代码:

        Person.Header h1 = Person.Header.newBuilder()
                .setKey("Key1")
                .setValue("value1")
                .build();

        Person person = Person.newBuilder()
                .setBody("TestBody")
                .setHeader(0, h1)
                .build();

这是我的 protobuff 消息(调用 dataformat.proto):

syntax = "proto3";
package tutorial;

option java_package = "tutorial";

message Person {
    string body = 1;
    repeated Header header = 2;

    message Header {
        string key = 3;
        string value = 4;
    }
}

堆栈跟踪:

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.set(ArrayList.java:453)
    at com.google.protobuf.ProtobufArrayList.set(ProtobufArrayList.java:96)
    at tutorial.Dataformat$Person.setHeader(Dataformat.java:572)
    at tutorial.Dataformat$Person.access00(Dataformat.java:42)
    at tutorial.Dataformat$Person$Builder.setHeader(Dataformat.java:815)

...

setHeader() 期望索引已经存在;它不会增加列表大小。这与 java.util.List 相同。您可以改用 addHeader()

对于重复的 List 数据类型,只需使用 add*** 而不是 set***
所以在你的例子中,你可以使用 addHeader(...) 而不是 setHeader(...)