प्रकार int का शाब्दिक xyz सीमा से बाहर है


90

मैं इस समय जावा में डेटा प्रकारों के साथ काम कर रहा हूं, और अगर मैंने सही ढंग से समझा है कि प्रकार long-9,223,372,036,854,775,808 से लेकर +9,223,372,036,854,775,807 के बीच मान को स्वीकार करता है। अब जैसा कि आप नीचे देख सकते हैं, मैंने एक longवैरिएबल बनाया है testLong, हालांकि जब मैं 9223372036854775807 मूल्य के रूप में सम्मिलित करता हूं, तो मुझे एक त्रुटि मिलती है:

टाइप इंट का शाब्दिक 922337203685474780807 सीमा से बाहर है।

मुझे नहीं पता कि यह longडेटा प्रकार के रूप में संदर्भित क्यों है int

क्या किसी के भी पास कोई सुझाव है?

कोड:

char testChar = 01;
byte testByte = -128;
int testInt = -2147483648;
short testShort = -32768;
long testLong = 9223372036854775807;
float testFoat;
double testDouble = 4.940656458412;
boolean testBool = true;

वैसे: आप किस कंपाइलर का उपयोग कर रहे हैं? इस समस्या के लिए एक्लिप्स और सन जेडडीके कंपाइलर दोनों (मेरी राय में बेहतर) त्रुटि संदेश देते हैं।
जोआचिम सॉउर

जवाबों:


195

Lअंत में एक पूंजी जोड़ें :

long value = 9223372036854775807L;

अन्यथा, कंपाइलर एक के रूप में शाब्दिक रूप से पार्स करने की कोशिश करेगा int, इसलिए त्रुटि संदेश


4
यह जावा लैंग्वेज स्पेक्स में है। यहां
लुकास ईडर

@ लुकास, लंबी कीमत = 00000077029062100L; मुझे वही त्रुटि देता है, और यह 19 अंकों से कम है। कोई भी आइडिया क्यों इसे फेंक रहा है "टाइप लंबी का शाब्दिक 0000007702062100L सीमा से बाहर है"
संतोश कुम्हार

1
@SantosshKumhar: यह एक अष्टक शाब्दिक है , जिसमें अंक 8या नहीं हो सकते हैं 9। प्रमुख शून्य निकालें।
लुकास एडर

50

मुझे नहीं पता कि यह एक इंट के रूप में लंबे डेटा प्रकार की बात क्यों कर रहा है

यह नहीं। आपको संकलक के संदेशों पर भरोसा करना सीखना चाहिए (विशेषकर जब वे समझदार, आधुनिक संकलक हों और प्राचीन C / C ++ संकलक न हों)। जबकि वे जो भाषा बोलते हैं, उसे कई बार समझना मुश्किल हो सकता है, लेकिन वे आमतौर पर आपसे झूठ नहीं बोलते हैं।

आइए इसे फिर से देखें:

इंट 9223372036854775807 का शाब्दिक सीमा से बाहर है।

ध्यान दें, कि यह आपके चर या प्रकार का कहीं भी उल्लेख नहीं करता है , इसलिए यह आरंभीकरण के बारे में नहीं है। समस्या किसी अन्य बिंदु पर होने लगती है।testLonglong

अब संदेश के कुछ हिस्सों की जांच करने देता है:

  • intहमें बताता है कि वह एक intमूल्य के रूप में कुछ करना चाहता है (जो आप चाहते थे वह नहीं है!)
  • "सीमा से बाहर" बहुत स्पष्ट है: कुछ अपेक्षित सीमा के भीतर नहीं है (शायद वह int)
  • "शाब्दिक": अब यह दिलचस्प है: एक शाब्दिक क्या है?

मैं एक पल के लिए शाब्दिक के बारे में बात करने के लिए आरामदायक सूची छोड़ दूँगा: शाब्दिक वे स्थान हैं जहाँ आपके कोड में कुछ मूल्य हैं। हैं Stringशाब्दिक, intशाब्दिक, classशाब्दिक और इतने पर। हर बार जब आप अपने कोड में एक मूल्य का स्पष्ट रूप से उल्लेख करते हैं, तो यह एक शाब्दिक है।

तो यह वास्तव में आपको चर घोषणा के बारे में परेशान नहीं कर रहा है, लेकिन खुद संख्या, मूल्य यह है कि यह आपके बारे में क्या कर रहा है।

आप एक संदर्भ में एक ही शाब्दिक का उपयोग करके इसे आसानी से सत्यापित कर सकते हैं जहां a longऔर intसमान रूप से स्वीकार्य हैं:

System.out.println(9223372036854775807);

PrintStream.printlnया तो एकint या एकlong (या बहुत कुछ और) ले सकते हैं । ताकि कोड ठीक होना चाहिए, है ना?

नहीं। ठीक है, शायद यह चाहिए हो, लेकिन नियमों के अनुसार यह है ठीक नहीं।

समस्या यह है कि "कुछ अंक" को एक intशाब्दिक के रूप में परिभाषित किया गया है और इसलिए इसके द्वारा परिभाषित सीमा में होना चाहिए int

यदि आप एक लिखने के लिए चाहते हैं, तो longशाब्दिक, तो आप उस जोड़कर स्पष्ट करना चाहिए L(या लोअर केस l, लेकिन मैं अत्यधिक , सुझाव है कि आप हमेशा अपर-केस भिन्न रूप का उपयोग, क्योंकि यह एक के लिए बहुत आसान को पढ़ने के लिए है और कठिन गलती करने के लिए 1)।

ध्यान दें कि एक समान समस्या float(पोस्टफ़िक्स F/ f) और double(पोस्टफ़िक्स D/ d) के साथ होती है।

साइड नोट: आपको पता चलेगा कि कोई शाब्दिक byteया shortशाब्दिक नहीं हैं और आप अभी भी मान (आमतौर पर intशाब्दिक) असाइन कर सकते हैं byteऔर shortचर कर सकते हैं: यह असाइनमेंट कन्वर्सेशन के बारे में possible 5.2 में विशेष नियमों के कारण संभव है : वे एक बड़े प्रकार के निरंतर अभिव्यक्ति के असाइनमेंट की अनुमति देते हैं करने के लिए byte, short, charया int अगर मान प्रकार के भीतर लेकर कर रहे हैं।


3
आप कहां से समय लेते हैं ;-)
लुकास ईडर

3
@ लुकास: मैं कभी-कभी इस आशा में ऐसे उत्तर लिखता हूं कि मुझे इसके लिए 300 छोटे लोगों को नहीं लिखना पड़ेगा;; साथ ही: त्रुटि संदेश (उम्मीद) की व्याख्या करने में मदद करने का अर्थ है "कम से कम उस त्रुटि संदेश का क्या मतलब है" सवाल।
जोचिम सॉर

आपका उत्तर बहुत अच्छा है ... इसमें कोई संदेह नहीं है, इसीलिए अप-वोट करें, लेकिन कृपया इसे संपादित करें और शीर्ष पर (अपने उत्तर की शुरुआत), बस 1 पंक्ति में समस्या का सटीक समाधान लिखें, और फिर आपके स्पष्टीकरण के नीचे। क्योंकि बहुत से लोग गहरी व्याख्या के बजाय त्वरित समाधान की तलाश करते हैं
शिरीष हेरवाडे

4
वे दूसरे दूसरे जवाबों को देखने के लिए स्वतंत्र हैं (उच्चतम मतदाता भी त्वरित समाधान देता है)। मुझे लगता है कि त्रुटि संदेश को समझने और समझने के लिए लोगों को शिक्षित करना लंबे समय में उनके लिए यह करने की तुलना में अधिक उपयोगी है। "एक आदमी को एक मछली दें ..." और वह सब।
जोआचिम सॉउर

साइड नोट के लिए धन्यवाद।
वेंकटेश गौड

19

करने की कोशिश करो 9223372036854775807LLअंत में जावा बताता है कि 9223372036854775807एक है long


0

मुझे अतीत में यह समस्या थी और मैंने तय किया कि वैज्ञानिक रूप में मूल्य लिखकर। उदाहरण के लिए:

double val = 9e300;

-2
long ak = 34778754226788444L/l;

दोनों का उपयोग करते हैं, लेकिन एक समय में केवल अपरकेस एल या लोअरकेस एल का उपयोग करते हैं।

एल / एल का उपयोग क्यों करें? क्योंकि लंबे समय से अभिन्न डेटाटाइप का एक हिस्सा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.