2017-10-18 66 views
5

का उत्पादन बंद करो मैं अपने कार्यक्रम के लिए परीक्षण लिख रहा हूं। कभी-कभी मेरे परीक्षण काम करते हैं, और कभी-कभी वे असफल होते हैं। मैं nondeterminism के सभी स्रोतों को ट्रैक करने की कोशिश कर रहा हूँ।बार-बार फेंक दिया गया ArrayIndexOutOfBoundsException स्टैक निशान

यहाँ मेरी समस्या का एक सरल, आत्म निहित उदाहरण है:

import java.util.ArrayList; 

public class ArrayExceptions { 
    public static void main(String[] args) { 
     final int ITERATIONS = 10000; 
     ArrayList<Integer> list = new ArrayList<>(); 
     try { 
      list.get(-1); 
     } catch(ArrayIndexOutOfBoundsException e) { 
      e.printStackTrace(); 
     } 
     for(int i = 0; i < ITERATIONS; i++) { 
      try{ 
       list.get(-1); 
      } catch (ArrayIndexOutOfBoundsException e) { 
       if(e.getMessage() == null) { 
        System.out.println(i); 
        break; 
       } 
      } 
     } 
     for(int i = 0; i < 10; i++) { 
      try { 
       list.get(-1); 
      } catch(ArrayIndexOutOfBoundsException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

इस कार्यक्रम के एक ArrayList पैदा करता है। यह बार-बार तत्व -1 तक पहुंचने का प्रयास करता है। प्रारंभ में, यह एक विस्तृत बैकट्रैक और ArrayIndexOutOfBoundsException के साथ एक संदेश बनाता है। हालांकि, अगर आप इसे पर्याप्त समय कहते हैं (जहां 'पर्याप्त' लगभग 5500 लगता है) फेंकने वाले अपवाद में बैकट्रैक और एक संदेश की कमी है।

इस कार्यक्रम का आउटपुट रन से चलाने के लिए भिन्न होता है। यहाँ यह जल्दी बाहर निकलता 5494 पुनरावृत्तियों में:

java.lang.ArrayIndexOutOfBoundsException: -1 
    at java.util.ArrayList.elementData(ArrayList.java:418) 
    at java.util.ArrayList.get(ArrayList.java:431) 
    at ArrayExceptions.main(ArrayExceptions.java:8) 
5494 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 

यहाँ यह देर से विफल रहता है 5540 पुनरावृत्तियों में:

java.lang.ArrayIndexOutOfBoundsException: -1 
    at java.util.ArrayList.elementData(ArrayList.java:418) 
    at java.util.ArrayList.get(ArrayList.java:431) 
    at ArrayExceptions.main(ArrayExceptions.java:8) 
5540 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 
java.lang.ArrayIndexOutOfBoundsException 

यह ऐसा क्यों कर रहा है?

उत्तर

5

कभी नहीं, इसे समझ लिया।

इस व्यवहार को बंद करने के लिए JVM को कमांड लाइन विकल्प के रूप में -XX:-OmitStackTraceInFastThrow पास करें। यह भी देखें NullPointerException stack trace not available without debug agent

संबंधित मुद्दे