# Fehler InitialContext.lookup



## Quaigon97 (2. Mai 2012)

Hallo Community...

Eine Anwendung auf Websphere wirft als Root Caus folgenden Stacktrace

```
Caused by: java.lang.ArrayIndexOutOfBoundsException
         at java.lang.String.getChars(String.java:666)
         at java.lang.StringBuilder.append(StringBuilder.java:207)
         at javax.naming.spi.NamingManager.getURLContext(NamingManager.java:646)
         at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:422)
         at javax.naming.InitialContext.lookup(InitialContext.java:436)
```

Der Betreffende Code ist folgender:

at javax.naming.spi.NamingManager.getURLContext(NamingManager.java:646)

```
// obtain pkg prefixes from hashtable
        String pkgPrefixes[] = EnvironmentReader
                .getFactoryNamesFromEnvironmentAndProviderResource(envmt, null,
                        Context.URL_PKG_PREFIXES);

        for (String element : pkgPrefixes) {			<--- 646
            // create factory instance
            ObjectFactory factory;
```

Ich bin Ratlos.... Wie um alles in der Welt kann man diesen Fehler provozieren ....

Danke für Hilfe


----------



## SlaterB (2. Mai 2012)

der Code passt nicht zur Fehlermeldung, deine Angabe zur Zeile 646 ist zu bezweifeln,


so wie dein Quellcode aussieht, hast du aber tatsächlich irgendwas wie lookup() in irgendeiner Registry drin,
du musst nur die richtige Zeile finden, 
ist der StackTrace noch länger?

wenn du bei der richtigen Zeile bist, dann übergibst du dort ja sicher irgendeinen String, eine URL, 
pkgPrefixes-Elemente klingen schon verdächtig, was passiert mit denen innerhalb der Schleife?

dieser Übergabeparameter ist offensichtlich für die Verarbeitung ungeeignet, schaue ihn dir an, läßt sich vielleicht direkt erkennen,
schaue dir andere funktionierende Aufrufe an, 
lösche/ vergiss notfalls vorerst dein Programm und wende die Tutorials zu die erklären was so ein lookup() sein soll,
welche Parameter geeignet sind usw.

wenn du meinst, das Prinzip zu verstehen, und dennoch nicht verstehst, warum ein bestimmter String X nicht akzeptiert wird,
dann poste diesen String hier und deine Vermutungen, warum es gehen sollte, 
poste z.B. ähnliche Strings die funktionieren


----------



## Quaigon97 (2. Mai 2012)

Hallo,

Der Komplette Code ist folgender....


```
/**
     * Creates a URL <code>Context</code> which can subsequently be used to
     * resolve any URLs with the URL scheme s. A <code>URLContextFactory</code>
     * is a type of <code>ObjectFactory</code> used to create a
     * <code>URLContext</code> when <code>getObjectInstance</code> is
     * invoked with the <code>Object o</code> set to null (see the description
     * of <code>ObjectFactory</code>).
     * <p>
     * This <code>getURLContext</code> method tries to locate the
     * <code>URLContextFactory</code> based on the
     * <code>Context.URL_PKG_PREFIXES</code> property which contains the
     * prefixes to be tried as the start of the package name. (See
     * <code>Context</code>).
     * </p>
     * <p>
     * Each package prefix entry (and finally the default value) are tried to
     * find the class which can be used to create the Context.
     * </p>
     * <p>
     * A full class name is derived as
     * <code>packageprefix.s.sURLContextFactory</code> where <code>s</code>
     * is the scheme.
     * </p>
     * <p>
     * For example if a scheme is abc and the package prefix to try is com.ibm
     * then the factory class to try is
     * <code>com.ibm.abc.abcURLContextFactory</code>. Once a factory is
     * created then a <code>Context</code> is created using the special use of
     * <code>ObjectFactory.getObjectInstance</code>.
     * </p>
     * <p>
     * Once a first factory is created, it is used to create the context, and NO
     * further attempts will be made on other pkg prefixes.
     * </p>
     * 
     * @param schema
     *            the URL scheme to which the Context will relate
     * @param envmt
     *            a <code>Hashtable</code> containing environment properties
     *            and values - may be null
     * @return the URL <code>Context</code> or null if no
     *         <code>URLContextFactory</code> instance can be created and
     *         therefore a Context cannot be created.
     * @throws NamingException
     *             if one is encountered.
     */
    public static Context getURLContext(String schema, Hashtable<?, ?> envmt)
            throws NamingException {

        if (null == schema || 0 == schema.length() || null == envmt) {
            return null;
        }

        // obtain pkg prefixes from hashtable
        String pkgPrefixes[] = EnvironmentReader
                .getFactoryNamesFromEnvironmentAndProviderResource(envmt, null,
                        Context.URL_PKG_PREFIXES);

        for (String element : pkgPrefixes) {
            // create factory instance
            ObjectFactory factory;
            String clsName = element + "." //$NON-NLS-1$
                    + schema + "." //$NON-NLS-1$
                    + schema + "URLContextFactory"; //$NON-NLS-1$

            factory = (ObjectFactory) factoryForName(clsName);
            if (null == factory) {
                continue;
            }
            
            try {
                // create url context using the factory, and return it
                return (Context) factory.getObjectInstance(null, null, null,
                        envmt);
            } catch (NamingException e) {
                // find NamingException, throw it
                throw e;
            } catch (Exception e) {
                // other exception, throw as NamingException
                // jndi.22=other exception happens: {0}
                NamingException nex = new NamingException(Messages.getString(
                        "jndi.22", e.toString())); //$NON-NLS-1$
                nex.setRootCause(e);
                throw nex;
            }
        }

        // cannot create context instance from any pkg prefixes, return null
        return null;
    }
```

zu finden in der IBM Websphere Runtime 7.0.0.15 jndi.jar

Der eigentliche Auslösende Code ist InitialContext.lookup(String) also ein normaler JNDI lookup.

Die Zeilennummer sind dem beiligenen SourceCode entnommen.

Das Pronziep des zugrundliegenen JNDI Lookups ist mir dabei durchaus klar, ich versuche nur zu verstehen wie ein JNDI Lookup mit diesem Stacktrace enden kann.

Die zugrundeliegene RessourceUrl habe ich leider nicht, da der Fehler nur ca alle 3 Wochen ein einziges Mal auftritt. Ich kann den Fehler nicht mal bewusst reproduzieren. Alles was ich habe ist dieser Stacktrace oder folgende Fehlermeldung: 
	
	
	
	





```
cannot find the factory for this scheme: ejblocal
```
 die aber in irgendeiner weise zusammen hängen.

Das einzige was mir an dieser stelle nicht klar ist, ist in welchem Zustand der jndi Namensraum sein muss, bzw mit was der lookup erfolgen muss um diesen Zustand/Stacktrace zu erzeugen.


----------



## Quaigon97 (7. Nov 2012)

SlaterB hat gesagt.:


> der Code passt nicht zur Fehlermeldung, deine Angabe zur Zeile 646 ist zu bezweifeln,



Nur um das ganze sinvoll abzuschließen, die Zeilennummer ist Korrekt und die Lösung des Problems ist folgende:

IBM IZ78413: JIT-COMPILED STRING.GETCHARS THROWS UNEXPECTED ARRAYINDEXOUTOFBO UNDSEXCEPTION - United States

Anscheinend gibt es einen noch nicht ganz gelösten BUG im JIT des IBM JDKs der genau zu diesem effekt führt, eine ArrayIndexOutOfBoundsException innerhalb einer foreach definition.

Manchmal liebe ich java ;-)


----------

