|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Sep 2005
Messaggi: 274
|
[JAVA] jre 6
Ho installato jre 6 su Windows XP
e sull'invocazione di questo metodo : Codice:
StackTraceElement[] ste = tr.getStackTrace(); System.out.println(ste[3].getMethodName()); java.lang.ArrayIndexOutOfBoundsException: 3 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 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Se ti interessa solo la versione:
System.getProperty("java.version");
__________________
|Java Base| |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Ho provato con un banale programmino:
Codice:
public class Prova
{
public static void main (String[] args)
{
StackTraceElement[] vste = Thread.currentThread ().getStackTrace ();
for (StackTraceElement ste : vste)
System.out.println (ste);
}
}
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
al massimo basta usare:
System.out.println(ste[ste.length - 1].getMethodName()); |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:49.











|








