[ 
https://issues.apache.org/jira/browse/LUCENE-7796?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15980320#comment-15980320
 ] 

Dawid Weiss commented on LUCENE-7796:
-------------------------------------

bq. That's not true. It is misuse, but behavior is still expected. The same 
happens if you change a method to suddenly throw a checked Exception. 

I don't think this is a good example, Uwe. What you're talking about is JVM 
validation (which indeed treats all exceptions equal). What I'm talking about 
is Java specification. From java specification viewpoint it is a compilation 
error if your depending class changes and suddently throws an unchecked 
exception. The fact that you can substitute a new class with different method 
signatures and re-run binaries is a weakness in java "linking" system and is, 
to me, unrelated.

What I'm talking about can be showcased fairly easily. Consider this code:
{code}
public class TestCustomAttr extends LuceneTestCase {
  public static interface CustomAttr extends Attribute {
  }
 
  public static final class CustomAttrImpl extends AttributeImpl {
    public CustomAttrImpl() throws Exception {
      throw new Exception("bah");
    }
    
    @Override
    public void clear() {}

    @Override
    public void reflectWith(AttributeReflector reflector) {}

    @Override
    public void copyTo(AttributeImpl target) {}
  }
  
  private class CustomFilter extends TokenFilter {
    protected CustomFilter(TokenStream input) {
      super(input);

      addAttribute(CustomAttr.class);
    }

    @Override
    public boolean incrementToken() throws IOException {
      return false;
    }
  }
  
  public void testUncheckedExceptionInAttrImpl() {
    Analyzer a = new Analyzer() {
      @Override
      protected TokenStreamComponents createComponents(String fieldName) {
        Tokenizer source = new WhitespaceTokenizer();
        TokenStream filters = source;
        filters = new CustomFilter(source);

        return new TokenStreamComponents(source, filters);
      }
    };

    a.tokenStream("",  "foo");
  }
}
{code}

As a Java programmer I have every reason to believe {{a.tokenStream}} never 
throws a checked exception, yet it surely does. I fail to see how this is 
verified by Java MethodHandles lookup (in fact, as the example above shows, it 
isn't).

I'm really fine in leaving it as is -- I understand how it works internally. 
But I do have a strong feeling sneaky throws aren't the "right" way in terms of 
how the Java language was designed (not talking about the JVM here). If you 
need a motivational example -- this is exactly the same situation as with 
method handles ({{invokeExact}}, etc.) or the old reflection API ({{Method}}) 
-- they declare Throwable, ExecutionException or other exception type wrapper 
as a java-language-compatible way of propagating unknown (checked or unchecked) 
exception from the (unknown) callee. Straight and simple, no surprises.

> Make reThrow idiom declare RuntimeException return type so callers may use it 
> in a way that compiler knows subsequent code is unreachable
> -----------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: LUCENE-7796
>                 URL: https://issues.apache.org/jira/browse/LUCENE-7796
>             Project: Lucene - Core
>          Issue Type: Improvement
>            Reporter: Dawid Weiss
>            Assignee: Dawid Weiss
>            Priority: Trivial
>             Fix For: 6.x, master (7.0)
>
>
> A spinoff from LUCENE-7792: reThrow can be declared to return an unchecked 
> exception so that callers can choose to use {{throw reThrow(...)}} as an 
> idiom to let the compiler know any subsequent code will be unreachable.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@lucene.apache.org
For additional commands, e-mail: dev-h...@lucene.apache.org

Reply via email to