මෙය මට කනිෂ් to සිට අතරමැදි සංවර්ධකයින් යම් අවස්ථාවක දී මුහුණ දෙන සාධාරණ පොදු ගැටළුවක් සේ පෙනේ: ඔවුන් එක්කෝ ඔවුන් සහභාගී වන කොන්ත්රාත්තු නොදැන හෝ විශ්වාස නොකරති. මීට අමතරව, තමන්ගේම කේතයක් ලිවීමේදී, ඔවුන් යමක් සඳහන් කිරීම සඳහා නැවත ශුන්යයන් මත යැපීමට නැඹුරු වන අතර එමඟින් ඇමතුම්කරුට ශුන්යයන් පරීක්ෂා කිරීමට අවශ්ය වේ.
මෙය වෙනත් ආකාරයකින් කිවහොත්, ශුන්ය පරීක්ෂණයක් සිදු වන අවස්ථා දෙකක් තිබේ:
කොන්ත්රාත්තුව අනුව වලංගු ප්රතිචාරයක් ශුන්ය වන විට; හා
එය වලංගු ප්රතිචාරයක් නොවන තැන.
(2) පහසුය. එක්කෝ assert
ප්රකාශ භාවිතා කරන්න (ප්රකාශ) හෝ අසාර්ථක වීමට ඉඩ දෙන්න (නිදසුනක් ලෙස, NullPointerException ). ප්රකාශයන් 1.4 හි එකතු කරන ලද ජාවා විශේෂාංගයකි. වාක්ය ඛණ්ඩය:
assert <condition>
හෝ
assert <condition> : <object>
කොහේද <condition>
බූලියන් ප්රකාශනයක් වන අතර <object>
එය toString()
ක්රමයේ ප්රතිදානය දෝෂයට ඇතුළත් කරනු ඇත.
ක assert
ප්රකාශය ඉතා අවුලට Error
( AssertionError
) තත්ත්වය සත්යයක් නො වේ නම්. පෙරනිමියෙන්, ජාවා ප්රකාශයන් නොසලකා හරියි. විකල්පය -ea
ජේවීඑම් වෙත යොමු කිරීමෙන් ඔබට ප්රකාශයන් සක්රීය කළ හැකිය . ඔබට තනි පන්ති සහ පැකේජ සඳහා ප්රකාශ සක්රිය හා අක්රීය කළ හැකිය. මෙයින් අදහස් කරන්නේ, සංවර්ධනය කිරීමේදී සහ පරීක්ෂා කිරීමේදී ඔබට ප්රකාශයන් සමඟ කේතය වලංගු කළ හැකි අතර නිෂ්පාදන පරිසරයක් තුළ ඒවා අක්රීය කළ හැකි වුවද, මගේ පරීක්ෂණයෙන් ප්රකාශ කර ඇති කාර්ය සාධන බලපෑමක් නොමැති බව පෙන්නුම් කරයි.
මෙම අවස්ථාවෙහිදී ප්රකාශයන් භාවිතා නොකිරීම හරි, මන්ද කේතය අසාර්ථක වනු ඇත, ඔබ ප්රකාශ භාවිතා කරන්නේ නම් එය සිදුවනු ඇත. එකම වෙනස නම්, ප්රකාශයන් සමඟ එය ඉක්මණින්, වඩාත් අර්ථවත් ආකාරයකින් හා සමහර විට අමතර තොරතුරු සමඟ සිදුවිය හැකි අතර, එය ඔබ අපේක්ෂා නොකළේ නම් එය සිදු වූයේ මන්දැයි සොයා ගැනීමට ඔබට උපකාරී වනු ඇත.
(1) ටිකක් අමාරුයි. ඔබ අමතන කේතය පාලනය කිරීමට ඔබට හැකියාවක් නොමැති නම් ඔබ හිර වී ඇත. ශුන්යය වලංගු ප්රතිචාරයක් නම්, ඔබ එය පරීක්ෂා කළ යුතුය.
එය ඔබ පාලනය කරන කේතය නම්, කෙසේ වෙතත් (සහ බොහෝ විට මෙය එසේ වේ), එය වෙනස් කතාවකි. ප්රතිචාරයක් ලෙස ශුන්ය භාවිතා කිරීමෙන් වළකින්න. එකතු කිරීම් ආපසු ලබා දෙන ක්රම සමඟ, එය පහසු ය: සෑම විටම ශුන්ය වෙනුවට හිස් එකතු කිරීම් (හෝ අරා) ආපසු එවන්න.
එකතු නොකිරීම සමඟ එය වඩාත් අපහසු විය හැකිය. මෙය උදාහරණයක් ලෙස සලකන්න: ඔබට මෙම අතුරුමුහුණත් තිබේ නම්:
public interface Action {
void doSomething();
}
public interface Parser {
Action findAction(String userInput);
}
එහිදී Parser අමු පරිශීලක ආදානය ගෙන යමක් කිරීමට සොයා ගනී, සමහර විට ඔබ යම් දෙයක් සඳහා විධාන රේඛා අතුරු මුහුණතක් ක්රියාත්මක කරන්නේ නම්. සුදුසු ක්රියාමාර්ගයක් නොමැති නම් එය නැවත ලබා දෙන කොන්ත්රාත්තුව දැන් ඔබට කළ හැකිය. එය ඔබ කතා කරන ශූන්ය පරීක්ෂාවට මග පාදයි.
විකල්ප විසඳුමක් නම් කිසි විටෙකත් ශුන්ය නොවන අතර ඒ වෙනුවට ශුන්ය වස්තු රටාව භාවිතා කරන්න :
public class MyParser implements Parser {
private static Action DO_NOTHING = new Action() {
public void doSomething() { /* do nothing */ }
};
public Action findAction(String userInput) {
// ...
if ( /* we can't find any actions */ ) {
return DO_NOTHING;
}
}
}
සසඳන්න:
Parser parser = ParserFactory.getParser();
if (parser == null) {
// now what?
// this would be an example of where null isn't (or shouldn't be) a valid response
}
Action action = parser.findAction(someInput);
if (action == null) {
// do nothing
} else {
action.doSomething();
}
වෙත
ParserFactory.getParser().findAction(someInput).doSomething();
එය වඩා සංක්ෂිප්ත කේතයකට මඟ පෙන්වන නිසා එය වඩා හොඳ නිර්මාණයකි.
අර්ථවත් දෝෂ පණිවිඩයක් සහිත ව්යතිරේකයක් විසි කිරීම findAction () ක්රමයට සම්පූර්ණයෙන්ම සුදුසු යැයි එයින් කියැවේ - විශේෂයෙන් ඔබ පරිශීලක ආදානය මත විශ්වාසය තබන මේ අවස්ථාවේ දී. පැහැදිලි කිරීමක් නොමැතිව සරල NullPointerException සමඟ පුපුරා යාම සඳහා ඇමතුම් ක්රමයට වඩා ව්යතිරේකයක් විසි කිරීම FindAction ක්රමයට වඩා හොඳය.
try {
ParserFactory.getParser().findAction(someInput).doSomething();
} catch(ActionNotFoundException anfe) {
userConsole.err(anfe.getMessage());
}
කිසිවක් නොකරන්න වෙනුවට උත්සාහ කිරීමේ / අල්ලා ගැනීමේ යාන්ත්රණය ඉතා අවලස්සන යැයි ඔබ සිතන්නේ නම්, ඔබේ පෙරනිමි ක්රියාව පරිශීලකයාට ප්රතිපෝෂණය ලබා දිය යුතුය.
public Action findAction(final String userInput) {
/* Code to return requested Action if found */
return new Action() {
public void doSomething() {
userConsole.err("Action not found: " + userInput);
}
}
}