2015-09-30 10 views
6

के तहत नहीं है मेरे पास एक यूनिट परीक्षण वाला एक प्रोजेक्ट है जो जावा 7 के तहत काम करता है, लेकिन जावा 8 के तहत नहीं। क्या ऐसी चीजों की जांच करने का कोई अच्छा तरीका है? (मुझे यकीन है कि परीक्षण सही है; यह सुझाव देता है कि कार्यान्वयन में एक सूक्ष्म बग है।)जावा 7 के तहत काम करने वाली किसी चीज़ को डीबग करने के लिए कैसे करें, लेकिन जावा 8

वास्तव में मुझे लगता है कि मैं क्या चाहता हूं यह पहचानने का एक त्वरित तरीका है कि कोड पथ अलग हो जाते हैं। लेकिन यह मुश्किल है, क्योंकि जेडीके के माध्यम से बहुत कम स्तर पर कोड पथों में सभी प्रकार के मतभेद हो सकते हैं, और मैं अप्रासंगिक मतभेदों में उलझन में नहीं आना चाहता हूं जो छोटे अनुकूलन के लिए नीचे हैं।

तो अच्छी बात यह होगी कि शीर्ष स्तर पथों को अलग करने के लिए पूछें; और फिर, उस बिंदु से ठीक पहले से पूछने के लिए, दूसरे स्तर पर पूछने के लिए पथों को अलग करें; और इसी तरह।

लेकिन मुझे नहीं पता कि ऐसा करने का कोई तरीका है या नहीं। मुझे डर है कि अगर मैं व्यवस्थित दृष्टिकोण नहीं रखता तो मैं बहुत समय बर्बाद कर सकता हूं।

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.006 sec <<< FAILURE! - in org.apache.phoenix.schema.PMetaDataImplTest 
testEviction(org.apache.phoenix.schema.PMetaDataImplTest) Time elapsed: 0.006 sec <<< FAILURE! 
java.lang.AssertionError: expected:<3> but was:<2> 
    at org.junit.Assert.fail(Assert.java:88) 
    at org.junit.Assert.failNotEquals(Assert.java:834) 
    at org.junit.Assert.assertEquals(Assert.java:645) 
    at org.junit.Assert.assertEquals(Assert.java:631) 
    at org.apache.phoenix.schema.PMetaDataImplTest.testEviction(PMetaDataImplTest.java:98) 
+6

कैसे आप कोड को डीबग करते हैं, इसके माध्यम से कदम उठाते हैं? – Andreas

+0

@ एंड्रियास मैं ऐसा कर सकता हूं, हां। लेकिन यह एक जेडीके संग्रह कार्यान्वयन के विनिर्देशों के लिए नीचे आ जाएगा, मुझे लगता है। और मुझे अलग-अलग जेडीके के साथ-साथ दो बार इसके माध्यम से कदम उठाने के लिए दो मशीनों की भी आवश्यकता होगी। –

+0

क्यों? यदि आप की जरूरत है तो आप एक ही मशीन पर एकाधिक जेडीके और आईडीई स्थापित कर सकते हैं। – Andreas

उत्तर

4

जावा 7 और जावा 8 के बीच सबसे अधिक दिखाई परिवर्तनों में से एक में परिवर्तन होता है:

कोड, वैसे, Apache Phoenix भंडार है, जहां जावा 8 के तहत, मैं निम्नलिखित विफलता मिलता है how hash data structures handle collisions - पहले से जुड़ी सूचियों का उपयोग किया गया था, अब प्रविष्टियों को संतुलित पेड़ों में संग्रहित किया जाता है। कुछ मामलों में यह इन डेटा संरचनाओं के पुनरावृत्ति क्रम को प्रभावित कर सकता है। यह एक भाषा प्रतिगमन नहीं है क्योंकि ये डेटा संरचनाएं स्पष्ट रूप से पुनरावृत्ति आदेश निर्दिष्ट नहीं करती हैं, लेकिन लापरवाह कोड और परीक्षण आसानी से लिखा जा सकता है जो एक निश्चित आदेश मानते हैं।

दुर्लभ स्थितियों में, यह परिवर्तन HashMap और HashSet की यात्रा आदेश में कोई परिवर्तन परिचय सकता है। HashMap ऑब्जेक्ट्स के लिए एक विशेष पुनरावृत्ति आदेश निर्दिष्ट नहीं है - किसी भी कोड जो पुनरावृत्ति आदेश पर निर्भर करता है उसे ठीक किया जाना चाहिए।

~ Collections Framework Enhancements in Java SE 8

तो पहली बात मैं करना होगा जब जावा 7 डिबगिंग -> 8 विफलताओं की HashMap, HashSet, और ConcurrentHashMap मिस-उपयोगों के लिए लग रही है। एक बार आपको गलती मिलने के बाद आपके पास कुछ विकल्प हैं:

  • डेटा संरचना को उस स्थान के साथ बदलें जो स्पष्ट रूप से पुनरावृत्ति आदेश प्रदान करता है, उदा। LinkedHashMap, TreeMap, या ImmutableMap
  • अपने उत्पादन कोड से पुनरावृत्ति-आदेश धारणाएं निकालें (उदाहरण के लिए यह मानते हुए कि एक निश्चित कुंजी/मान मानचित्र में पहला तत्व होगा)।
  • अनिश्चित व्यवहार (किस क्रम) के बजाय वास्तव में निर्दिष्ट व्यवहार (कौन से तत्व) के लिए जांचने के लिए अपने परीक्षणों में सुधार करें। अक्सर परीक्षण डेटा को आसानी से लिखने लेकिन गलत तरीके से परिभाषित किया जाएगा, जैसे इनलाइन सरणी सिंटैक्स int[] expected = {1,2,3} और फिर तत्वों पर लूपिंग का उपयोग करना। आप अमरूद के स्थिर रचनाकारों (ImmutableSet.of(1,2,3)) या Truth के धाराप्रवाह दावे वाक्यविन्यास (assertThat(someSet).containsExactly(1, 2, 3)) का उपयोग करके इसे आसान बना सकते हैं।

यदि हैश ऑर्डरिंग मूल कारण साबित नहीं होती है तो आपकी समस्या अधिक सूक्ष्म हो सकती है और सुझाव दिया गया है कि आपका सबसे अच्छा विकल्प डीबगर के साथ कदम उठाने की संभावना है।कम से कम What's New in JDK 8 को सुराग के लिए स्किम करना सुनिश्चित करें।

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