Trying to benefit from exception transparency

Florian Weimer fweimer at bfk.de
Tue Aug 10 03:09:09 PDT 2010


I'm trying to replace some exsting APIs with something that provides
exception transparency.  I expected the example below to compile:

import java.sql.SQLException;

class Main {
    public static void main(ConnectionPool pool) throws SQLException {
    pool.run(Txn<Void, void> #{  // ***
                       query("SELECT 1");
        });
    }
}

interface ConnectionPool {
    <T, throws E> T run(Txn<T, E> txn) throws SQLException, E;
}

abstract class Txn<T, throws E> {
    protected final void query(String statement) throws SQLException {
    }

    protected abstract T run() throws E;
}

But I get an NPE, related to the line marked ***:

java.lang.NullPointerException
	at com.sun.tools.javac.comp.TransTypes.visitIdent(TransTypes.java:702)
	at com.sun.tools.javac.tree.JCTree$JCIdent.accept(JCTree.java:1817)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.comp.TransTypes.translate(TransTypes.java:425)
	at com.sun.tools.javac.comp.TransTypes.visitApply(TransTypes.java:594)
	at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1323)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.comp.TransTypes.translate(TransTypes.java:425)
	at com.sun.tools.javac.comp.TransTypes.visitExec(TransTypes.java:572)
	at com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1166)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:70)
	at com.sun.tools.javac.tree.TreeTranslator.visitBlock(TreeTranslator.java:160)
	at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:789)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.comp.TransTypes.translate(TransTypes.java:425)
	at com.sun.tools.javac.comp.TransTypes.visitMethodDef(TransTypes.java:461)
	at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:672)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:70)
	at com.sun.tools.javac.tree.TreeTranslator.visitClassDef(TreeTranslator.java:134)
	at com.sun.tools.javac.comp.TransTypes.translateClass(TransTypes.java:811)
	at com.sun.tools.javac.comp.TransTypes.translateClass(TransTypes.java:794)
	at com.sun.tools.javac.comp.TransTypes.visitClassDef(TransTypes.java:447)
	at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:601)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.comp.TransTypes.translate(TransTypes.java:425)
	at com.sun.tools.javac.comp.TransTypes.visitNewClass(TransTypes.java:625)
	at com.sun.tools.javac.tree.JCTree$JCNewClass.accept(JCTree.java:1377)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.comp.TransTypes.translate(TransTypes.java:425)
	at com.sun.tools.javac.comp.TransTypes.translateArgs(TransTypes.java:196)
	at com.sun.tools.javac.comp.TransTypes.visitApply(TransTypes.java:610)
	at com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1323)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.comp.TransTypes.translate(TransTypes.java:425)
	at com.sun.tools.javac.comp.TransTypes.visitExec(TransTypes.java:572)
	at com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1166)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:70)
	at com.sun.tools.javac.tree.TreeTranslator.visitBlock(TreeTranslator.java:160)
	at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:789)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.comp.TransTypes.translate(TransTypes.java:425)
	at com.sun.tools.javac.comp.TransTypes.visitMethodDef(TransTypes.java:461)
	at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:672)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:70)
	at com.sun.tools.javac.tree.TreeTranslator.visitClassDef(TreeTranslator.java:134)
	at com.sun.tools.javac.comp.TransTypes.translateClass(TransTypes.java:811)
	at com.sun.tools.javac.comp.TransTypes.visitClassDef(TransTypes.java:447)
	at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:601)
	at com.sun.tools.javac.tree.TreeTranslator.translate(TreeTranslator.java:58)
	at com.sun.tools.javac.comp.TransTypes.translate(TransTypes.java:425)
	at com.sun.tools.javac.comp.TransTypes.translateTopLevelClass(TransTypes.java:836)
	at com.sun.tools.javac.main.JavaCompiler.desugar(JavaCompiler.java:1323)
	at com.sun.tools.javac.main.JavaCompiler.desugar(JavaCompiler.java:1213)
	at com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:849)
	at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:808)
	at com.sun.tools.javac.main.Main.compile(Main.java:409)
	at com.sun.tools.javac.main.Main.compile(Main.java:327)
	at com.sun.tools.javac.main.Main.compile(Main.java:318)
	at com.sun.tools.javac.Main.compile(Main.java:82)
	at com.sun.tools.javac.Main.main(Main.java:67)


When I replace the *** line with

    pool.run(#{

I get an error from the compiler:

Main.java:5: unreported exception Exception; must be caught or declared to be thrown
	pool.run(#{
	        ^

It is not clear to me why the compiler would infer that Exception is
thrown by this piece of code.

I'm at this compiler version:

changeset:   622:aa43887d183f
tag:         tip
user:        mcimadamore
date:        Mon Aug 09 16:27:25 2010 +0100
summary:     Fixed some bugs:

-- 
Florian Weimer                <fweimer at bfk.de>
BFK edv-consulting GmbH       http://www.bfk.de/
Kriegsstraße 100              tel: +49-721-96201-1
D-76133 Karlsruhe             fax: +49-721-96201-99


More information about the lambda-dev mailing list