[
http://issues.apache.org/jira/browse/JDO-194?page=comments#action_12365084 ]
Martin Zaun commented on JDO-194:
---------------------------------
> JDO implementations should behave defensively and treat both
> NoClassDefFoundError and ClassNotFoundException as "class does not exist".
In fact, this does not only include NoClassDefFoundErrors but LinkageErrors in
general, see below.
>We are going to file a bug on the JRE saying that behavior for classes that
>don't exist is inconsistent based on the platform and the name. Specifically,
>it seems that Windows platforms get confused trying to resolve class names
>that differ in capitalization from real class names.
The JRE's behaviour doesn't strike me as inconsistent with the Java specs after
consulting the Java Language Specification (3rd edition)
http://java.sun.com/docs/books/jls/index.html
and, more detailed, the revised chapter 5 "Loading, Linking and Initializing"
of the the Java VM Specification (2nd edition + latest amendments):
http://java.sun.com/docs/books/vmspec/2nd-edition/ConstantPool.pdf
In a nutshell:
1) A ClassNotFoundException is thrown when no binary representation of a class
could be found at all; a LinkageError, including NoClassDefFoundError, is
thrown when some representation was found but it's "content" turns out not to
be a feasible or the required class.
2) ClassLoader.loadClass() is a place where LinkageErrors may occur. (There
are rules about when classloaders, which may employ an eager or lazy loading
strategy, may throw such errors).
3) The process of finding of a binary representation of a class is specified as
platform-dependent -- even for the bootstrap classloader. Note that
user-defined classloaders have all freedom anyway (for instance, loading
classes over the net).
So, a classloader may, by its rules, report to have located a binary
representation for a class name, which then turns out not to be the required
class, thus, resulting in a LinkageError.
The VM spec is explicit on this:
5.3.1 Loading Using the Bootstrap Class Loader
The following steps are used to load and thereby create the nonarray class or
interface C denoted by N using the bootstrap class loader.
...
1. The Java virtual machine searches for a purported representation of C in a
platform- dependent manner. Note that there is no guarantee that a purported
representation found is valid or is a representation of C.
Typically, a class or interface will be represented using a file in a
hierarchical file system. The name of the class or interface will usually be
encoded in the pathname of the file.
This phase of loading must detect the following error:
* If no purported representation of C is found, loading throws an instance
of NoClassDefFoundError or an instance of one of its subclasses.
> JPOX does not support implicit variables.
> -----------------------------------------
>
> Key: JDO-194
> URL: http://issues.apache.org/jira/browse/JDO-194
> Project: JDO
> Type: Bug
> Components: tck20
> Reporter: Michael Watzek
> Assignee: Michael Bouschen
>
> JPOX throws an exception executing queries having implicit parameters (see
> below). The bug may be reproduced executing test case
> org.apache.jdo.tck.query.jdoql.variables.VariablesAndFields.
> Query: SELECT FROM org.apache.jdo.tck.pc.company.Employee WHERE
> team.contains(employee) & employee.firstname == 'emp1First'
> org.jpox.store.exceptions.NoSuchPersistentFieldException: Field "employee"
> does not exist in org.apache.jdo.tck.pc.company.Person or is not persistent
> at
> org.jpox.store.rdbms.table.ClassTable.getFieldMapping(ClassTable.java:1790)
> at
> org.jpox.store.expression.TableExpression.newFieldExpression(TableExpression.java:183)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileIdentifier(JDOQLQuery.java:1534)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compilePrimary(JDOQLQuery.java:1299)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileUnaryExpressionNotPlusMinus(JDOQLQuery.java:1245)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileUnaryExpression(JDOQLQuery.java:1226)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileMultiplicativeExpression(JDOQLQuery.java:1179)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileAdditiveExpression(JDOQLQuery.java:1156)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileRelationalExpression(JDOQLQuery.java:1125)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileEqualityExpression(JDOQLQuery.java:1102)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileAndExpression(JDOQLQuery.java:1090)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileExclusiveOrExpression(JDOQLQuery.java:1078)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileInclusiveOrExpression(JDOQLQuery.java:1066)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileConditionalAndExpression(JDOQLQuery.java:1054)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileConditionalOrExpression(JDOQLQuery.java:1036)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileExpression(JDOQLQuery.java:1013)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compilePrimary(JDOQLQuery.java:1346)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileUnaryExpressionNotPlusMinus(JDOQLQuery.java:1245)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileUnaryExpression(JDOQLQuery.java:1226)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileMultiplicativeExpression(JDOQLQuery.java:1179)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileAdditiveExpression(JDOQLQuery.java:1156)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileRelationalExpression(JDOQLQuery.java:1125)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileEqualityExpression(JDOQLQuery.java:1102)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileAndExpression(JDOQLQuery.java:1090)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileExclusiveOrExpression(JDOQLQuery.java:1078)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileInclusiveOrExpression(JDOQLQuery.java:1066)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileConditionalAndExpression(JDOQLQuery.java:1054)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileConditionalOrExpression(JDOQLQuery.java:1036)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileExpression(JDOQLQuery.java:1013)
> at
> org.jpox.store.query.JDOQLQuery$Compiler.compileQueryStatement(JDOQLQuery.java:891)
> at org.jpox.store.query.JDOQLQuery.compile(JDOQLQuery.java:569)
> at org.jpox.store.query.JDOQLQuery.performExecute(JDOQLQuery.java:639)
> at org.jpox.store.query.Query.executeWithMap(Query.java:907)
> at org.jpox.store.query.Query.executeWithArray(Query.java:887)
> at org.jpox.store.query.Query.execute(Query.java:819)
> at org.apache.jdo.tck.query.QueryTest.execute(QueryTest.java:706)
> at
> org.apache.jdo.tck.query.QueryTest.executeAPIQuery(QueryTest.java:625)
> at
> org.apache.jdo.tck.query.QueryTest.executeAPIQuery(QueryTest.java:601)
> at
> org.apache.jdo.tck.query.jdoql.variables.VariablesAndFields.testPositive(VariablesAndFields.java:148)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:324)
> at junit.framework.TestCase.runTest(TestCase.java:154)
> at org.apache.jdo.tck.JDO_Test.runBare(JDO_Test.java:204)
> at junit.framework.TestResult$1.protect(TestResult.java:106)
> at junit.framework.TestResult.runProtected(TestResult.java:124)
> at junit.framework.TestResult.run(TestResult.java:109)
> at junit.framework.TestCase.run(TestCase.java:118)
> at junit.framework.TestSuite.runTest(TestSuite.java:208)
> at junit.framework.TestSuite.run(TestSuite.java:203)
> at junit.framework.TestSuite.runTest(TestSuite.java:208)
> at junit.framework.TestSuite.run(TestSuite.java:203)
> at junit.textui.TestRunner.doRun(TestRunner.java:116)
> at junit.textui.TestRunner.doRun(TestRunner.java:109)
> at
> org.apache.jdo.tck.util.BatchTestRunner.start(BatchTestRunner.java:120)
> at org.apache.jdo.tck.util.BatchTestRunner.main(BatchTestRunner.java:95)
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira