[
https://issues.apache.org/jira/browse/UIMA-5845?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16558330#comment-16558330
]
Richard Eckart de Castilho commented on UIMA-5845:
--------------------------------------------------
Ok - the CasRuntimeException is probably better than a NullPointerException
because it is thrown at the source of the problem, not at a later point where
it may be difficult to track it back to the source. But the CasRuntimeException
is very generic. So if it is not clear whether the selection is empty or not,
we'd currently have to call nullOK and then check for null. Hm - well, since
SelectFS is a stream, I suppose the best option in such a case would be to call
neither `single()` nor `get()` but rather `findFirst()` which returns an
`Optional`. I assume that `findFirst()` is almost equivalent to `get()`, right?
So I guess I'm also +1 for throwing the exception on `get()` depending on the
´nullOK´ flag and having that flag set to false by default.
> Inconsistent behavior on going beyond index limits in SelectFS
> --------------------------------------------------------------
>
> Key: UIMA-5845
> URL: https://issues.apache.org/jira/browse/UIMA-5845
> Project: UIMA
> Issue Type: Bug
> Components: Core Java Framework
> Affects Versions: 3.0.0SDK
> Reporter: Richard Eckart de Castilho
> Priority: Major
>
> The behavior of trying to address annotations outside the index appears to be
> inconsistent.
> For example, the following call returns `null`:
> {code}
> String text = "one two three";
> tokenBuilder.buildTokens(jCas, text);
> List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
>
> for (Token token : tokens) {
> new AnalyzedText(jCas, token.getBegin(), token.getEnd()).addToIndexes();
> }
>
> Token firstToken = tokens.get(0);
> AnalyzedText x = jCas.select(AnalyzedText.class).preceding(firstToken,
> 0).get();
> {code}
> However, this code trying go from the end of the index to before the first
> item throws a CASRuntime exception:
> {code}
> String text = "Rot wood cheeses dew?";
> tokenBuilder.buildTokens(jCas, text);
> assertThatExceptionOfType(CASRuntimeException.class)
> .isThrownBy(() -> jCas.select(Token.class).backwards().get(4))
> .withMessage("CAS does not contain any '" + Token.class.getName() +
> "' instances shifted by: 4.");
> {code}
> It would seem reasonably to either always return null or to always thrown an
> exception. If an exception is thrown, it would seem reasonable to introduce a
> subtype of the CASRuntimeException, e.g. a CASIndexOutOfBounds exception or
> something the likes. CASRuntimeException seems very general.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)