यह वरीयता और सम्मेलन के मामले के बीच कहीं है।
आम तौर पर, लोग प्रोग्रामिंग त्रुटियों को इंगित करने के लिए आवेषण का उपयोग करेंगे; यही है, "अगर मैंने अपना काम सही किया, तो एक गैर-शून्य param
कभी परिणामस्वरूप उपयोगकर्ता इनपुट या अन्य बाहरी ताकतों के बावजूद get
से -1 में परिणाम होगा।" मैं उन्हें लगभग टिप्पणियों के रूप में मानता हूं जो वैकल्पिक रूप से रनटाइम पर सत्यापित किए जा सकते हैं।
दूसरी ओर, यदि get
वापस कर सकती है -1 कुछ मामलों में, लेकिन यह है कि इनपुट अमान्य है, तो मैं आम तौर पर एक IllegalArgumentException
फेंक होता है, और checkArgument
यह करने के लिए एक पूरी तरह से उचित तरीका है। इसका एक दोष यह है कि जब आप बाद में इसे पकड़ते हैं, तो यह कहीं भी कहीं से भी आ सकता था। पर विचार करें:
try {
baz();
bar();
foo(myInput);
} catch (IllegalArgumentException e) {
// Where did this come from!?
// It could have come from foo(myInput), or baz(), or bar(),
// or some method that any of them invoked, or really anywhere
// in that stack.
// It could be something totally unrelated to user input, just
// a bug somewhere in my code.
// Handle it somehow...
}
मामलों में जहां कि मामलों में - उदाहरण के लिए, आप उपयोगकर्ता है कि वे अपने इनपुट के रूप में -1
प्रवेश करने की अनुमति नहीं कर रहे हैं करने के लिए एक उपयोगी टिप्पणी पॉप अप करना चाहते हैं - आप फेंक कर सकते हैं एक कस्टम अपवाद है, ताकि आप और अधिक आसानी से इसे बाद में पकड़ कर सकते हैं:
try {
baz();
bar();
foo(myInput);
} catch (BadUserInputException e) {
reportError("Bad input: " + e.getMessage());
log.info("recorded bad user input", e);
}
checkState
का सवाल है, यह वास्तव में मेरे लिए सही नहीं लग रहा। उस अपवाद का आमतौर पर तात्पर्य है कि समस्या यह थी कि this
(या एप्लिकेशन में कुछ अन्य, अधिक वैश्विक स्थिति) में था। the docs से:
सिग्नल कि एक विधि अवैध या अनुचित समय पर लागू की गई है।
आपके मामले में, -1 -1 कभी भी उपयुक्त नहीं है, इसलिए checkState
भ्रामक है।अब, अगर यह किया गया था:
if (x == -1 && (!allowNegativeOne()) { ... }
... तो यह है कि अधिक उपयुक्त, होगा, हालांकि यह अभी भी दोष यह है कि IllegalArgumentException
ऊपर था है।
तो, आखिरकार, इस सवाल का सवाल है कि आपको if
रखना चाहिए या एक सहायक विधि का उपयोग करना चाहिए। यह वास्तव में स्वाद के लिए आता है, चेक कितना जटिल है, और कितनी बार इसका उपयोग किया जाता है (उदाहरण के लिए अन्य तरीकों में)। यदि चेक x == -1
जितना आसान है और यह जांच कभी भी अन्य तरीकों से नहीं की जाती है (इसलिए कोड पुन: उपयोग कोई मुद्दा नहीं है), तो मैं केवल if
रखूंगा।
तरीका है अपने कोड डेटा की जाँच करता है काफी वैध है, लेकिन आप 'RuntimeException' तुलना में एक अधिक 'ठोस' अपवाद का उपयोग करना चाहें - शायद' IllegalStateException', या अपनी खुद की। – vikingsteve
आमतौर पर, * * "यह कभी नहीं हुआ होना चाहिए" * अपवाद एक RuntimeException की बजाय एक AssertionError होना चाहिए। जोर का उपयोग करना थोड़ा नाजुक है क्योंकि यह JVM तर्कों पर निर्भर करता है ... इसके अलावा आपका कोड मुझे ठीक लग रहा है। – assylias
ऐसा लगता है कि हो रही -1 तर्क के साथ काम करने का एक परिणाम के रूप में एक वैध 'IllegalArgumentException' है, इसलिए मैं का प्रयोग करेंगे' checkArgument (एक्स - -1, "मेरा संदेश") '' –