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