What does "javax.naming.NoInitialContextException" mean?

jdbcnewbie. picture jdbcnewbie. · Jun 17, 2011 · Viewed 108.8k times · Source

As the title suggests, what does "javax.naming.NoInitialContextException" mean in non technical terms? And what are some general suggestions to fix it?

EDIT (From the console):

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at cepars.app.ConnectionHelper.getConnection(ConnectionHelper.java:25)
    at cepars.app.ConnectionHelper.getConnection(ConnectionHelper.java:10)
    at cepars.review.ReviewDAO.getJobList(ReviewDAO.java:30)
    at cepars.review.Test.main(Test.java:43)
java.lang.NullPointerException
    at cepars.review.ReviewDAO.getJobList(ReviewDAO.java:31)
    at cepars.review.Test.main(Test.java:43)
cepars.app.DAOException
    at cepars.review.ReviewDAO.getJobList(ReviewDAO.java:39)
    at cepars.review.Test.main(Test.java:43)

Answer

pap picture pap · Jun 17, 2011

It means that there is no initial context :)

But seriously folks, JNDI (javax.naming) is all about looking up objects or resources from some directory or provider. To look something up, you need somewhere to look (this is the InitialContext). NoInitialContextException means "I want to find the telephone number for John Smith, but I have no phonebook to look in".

An InitialContext can be created in any number of ways. It can be done manually, for instance creating a connection to an LDAP server. It can also be set up by an application server inside which you run your application. In this case, the container (application server) already provides you with a "phonebook", through which you can look up anything the application server makes available. This is often configurable and a common way of moving this type of configuration from the application implementation to the container, where it can be shared across all applications in the server.

UPDATE: from the code snippet you post it looks like you are trying to run code stand-alone that is meant to be run in an application server. In this case, the code attempting to get a connection to a database from the "phonebook". This is one of the resources that is often configured in the application server container. So, rather than having to manage configuration and connections to the database in your code, you can configure it in your application server and simple ask for a connection (using JNDI) in your code.