Android V2中的BreakIterator.preceding失败?

And*_*sen 3 android

以下代码适用于Android 4,但在Android 2中导致IllegalArgumentException.

有线索吗?

Locale currentLocale = new Locale("en_UK"); 
final BreakIterator boundary = BreakIterator.getSentenceInstance(currentLocale);
boundary.setText("a"); 
int thisThrowsExceptionInVersion2 = boundary.preceding(1);
Run Code Online (Sandbox Code Playgroud)

例外:

08-08 22:29:14.414: E/AndroidRuntime(329): Caused by: java.lang.IllegalArgumentException
08-08 22:29:14.414: E/AndroidRuntime(329):  at java.text.RuleBasedBreakIterator.validateOffset(RuleBasedBreakIterator.java:74)
08-08 22:29:14.414: E/AndroidRuntime(329):  at java.text.RuleBasedBreakIterator.preceding(RuleBasedBreakIterator.java:158)
08-08 22:29:14.414: E/AndroidRuntime(329):  at kalle.palle.namespace.KallePalleActivity.onCreate(KallePalleActivity.java:26)
Run Code Online (Sandbox Code Playgroud)

nan*_*esh 7

下面是Gingerbread代码中的validateOffset

private void validateOffset(int offset) {
    CharacterIterator it = wrapped.getText();
    if (offset < it.getBeginIndex() || offset >= it.getEndIndex()) {
        throw new IllegalArgumentException();
    }
}
Run Code Online (Sandbox Code Playgroud)

并在ICS代码如下

private void validateOffset(int offset) {
    CharacterIterator it = wrapped.getText();
    if (offset < it.getBeginIndex() || offset > it.getEndIndex()) {
        String message = "Valid range is [" + it.getBeginIndex() + " " + it.getEndIndex() + "]";
        throw new IllegalArgumentException(message);
    }
}
Run Code Online (Sandbox Code Playgroud)

>= 已改为>.在2.X设备中,结束偏移检查似乎是错误的.在您传递的偏移量preceding与字符串的结束索引重叠的情况下尤其如此.这似乎是框架中的错误.
您可以在libcore/luni/src/main/java/java/text/RuleBasedBreakIterator.java中找到AOSP代码中的源代码.
这是Gingerbread代码,这是ICS代码