View Full Version : [JAVA] jre 6
Ho installato jre 6 su Windows XP
e sull'invocazione di questo metodo :
StackTraceElement[] ste = tr.getStackTrace();
System.out.println(ste[3].getMethodName());
mi dà quest'errore:
java.lang.ArrayIndexOutOfBoundsException: 3 :muro:
Forzando invece l'esecuzione con la jre 5 và tutto a buon fine.
Qualcuno sà dirmi il perchè?
E poi un'altra domanda.
E' possibile sapere a runtime con quale jre si stà eseguendo l'applicazione?
Grazie
Se ti interessa solo la versione:
System.getProperty("java.version");
Qualcuno sà dirmi il perchè?
La risposta è: perchè l'array tr non ha un componente di indice 3.
Quando al fatto che lo stesso programma eseguito su una diversa piattaforma Java dimostri un comportamento diverso è, relativamente all'eccezione sollevata, irrilevante.
Non c'è una norma del linguaggio o una regola della libreria che dica che l'array restituito da getStackTrace() di Throwable abbia almeno quattro componenti.
getStackTrace restituisce lo stato della pila di invocazioni del Thread corrente nel momento in cui si verifica l'eccezione. E' possibile che in Java 6 il numero invocazioni che precedono il metodo incriminato sia minore che in Java 5. Ma, ripeto, non questo numero non è sicuramente un invariante.
Ho provato con un banale programmino:
public class Prova
{
public static void main (String[] args)
{
StackTraceElement[] vste = Thread.currentThread ().getStackTrace ();
for (StackTraceElement ste : vste)
System.out.println (ste);
}
}
Output con Java 6:
java.lang.Thread.getStackTrace(Thread.java:1426)
Prova.main(Prova.java:5)
Output con Java 5:
java.lang.Thread.dumpThreads(Native Method)
java.lang.Thread.getStackTrace(Thread.java:1383)
Prova.main(Prova.java:5)
E in effetti con il Java 5 c'è uno stack frame in più al top. Ora ... perché ci sia non lo so .... in teoria non ci dovrebbe essere! Perché se volessi determinare in quale metodo sono (Prova.main) dovrei fare vste[1] ma così funzionerebbe correttamente solo con il Java 6.
al massimo basta usare:
System.out.println(ste[ste.length - 1].getMethodName());
Secondo la documentazione l'array restituito da getStackTrace() può avere lunghezza zero, o quella di un altra JVM meno uno o fare un po' come gli pare.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.