¡° Òì ³£¡± Ö¸ µÄ ÊÇ ³Ì Ðò ÔË ÐРʱ ³ö ÏÖ µÄ ·Ç Õý ³£ Çé ¿ö¡£ ÔÚ Óà ´« ͳ µÄ Óï ÑÔ ±à ³Ì ʱ£¬ ³Ì Ðò Ô± Ö» ÄÜ Í¨ ¹ý º¯ Êý µÄ ·µ »Ø Öµ À´ ·¢ ³ö ´í Îó ЊϢ¡£ Õâ Ò× ÓÚ µ¼ Ö ºÜ ¶à ´í Îó£¬ Òò Ϊ ÔÚ ºÜ ¶à Çé ¿ö Ï Ðè Òª Öª µÀ ´í Îó ²ú Éú µÄ ÄÚ ²¿ ϸ ½Ú¡£ ͨ ³££¬ Óà ȫ ¾Ö ±ä Á¿errnoÀ´ ´æ ´¢¡° Òì ³£¡± µÄ Àà ÐÍ¡£ Õâ ÈÝ Ò× µ¼ Ö Îó Ó㬠Òò Ϊ Ò» ¸öerrnoµÄ Öµ ÓÐ ¿É ÄÜ ÔÚ ±» ´¦ Àí Ö® ǰ ±» Áí Íâ µÄ ´í Îó ¸² ¸Ç µô¡£ ¼´ ʹ ×î ÓÅ ÃÀ µÄCÓï ÑÔ ³Ì Ðò£¬ Ϊ ÁË ´¦ Àí¡° Òì ³£¡± Çé ¿ö£¬ Ò² ³£ Çó Öú ÓÚgotoÓï ¾ä¡£ Java¶Ô¡° Òì ³£¡± µÄ ´¦ Àí ÊÇ Ãæ Ïò ¶Ô Ïó µÄ¡£ Ò» ¸öJavaµÄExceptionÊÇ Ò» ¸ö Ãè Êö¡° Òì ³£¡± Çé ¿ö µÄ ¶Ô Ïó¡£ µ± ³ö ÏÖ¡° Òì ³£¡± Çé ¿ö ʱ£¬ Ò» ¸öException¶Ô Ïó ¾Í ²ú Éú ÁË£¬ ²¢ ·Å µ½ ²ú Éú Õâ ¸ö¡° Òì ³£¡± µÄ ³É Ô± º¯ Êý Àï¡£
JavaµÄ¡° Òì ³£¡± ´¦ Àí ÊÇ Í¨ ¹ý5¸ö ¹Ø ¼ü ´Ê À´ ʵ ÏÖ µÄ£ºtry, catch, throw, throwsºÍfinally¡£ ÓÃtry À´ Ö´ ÐÐ Ò» ¶Î ³Ì Ðò£¬ Èç ¹û ³ö ÏÖ¡° Òì ³£¡±£¬ ϵ ͳ Å× ³ö£¨throws£© Ò» ¸ö¡° Òì ³£¡±£¬ Äã ¿É ÒÔ Í¨ ¹ý Ëü µÄ Àà ÐÍ À´ ²¶ ×½£¨catch£© Ëü£¬ »ò ×î ºó£¨finally£© ÓÉ È± Ê¡ ´¦ Àí Æ÷ À´ ´¦ Àí¡£ ÏÂ Ãæ ÊÇ¡° Òì ³£¡± ´¦ Àí ³Ì Ðò µÄ »ù ±¾ ÐΠʽ£º
try { //³Ì Ðò ¿é } catch (ExceptionType1 e) { // ¶ÔExceptionType1µÄ ´¦ Àí } catch (ExceptionType2 e) { // ¶ÔExceptionType2µÄ ´¦ Àí throw(e); //ÔÙ Å× ³ö Õâ ¸ö¡° Òì ³£¡± } finally { }
ÔÚ¡° Òì ³£¡± Àà ²ã ´Î µÄ ×î ÉÏ ²ã ÓÐ Ò» ¸ö µ¥ ¶À µÄ Àà ½Ð ×öThrowable¡£ Õâ ¸ö Àà Óà À´ ±í ʾ Ëù ÓÐ µÄ¡° Òì ³£¡± Çé ¿ö¡£ ÿ ¸ö¡° Òì ³£¡± Àà ÐÍ ¶¼ ÊÇThrowableµÄ ×Ó Àà¡£ThrowableÓÐ Á½ ¸ö Ö± ½Ó µÄ ×Ó Àà¡£ Ò» Àà ÊÇException£¬ ÊÇ Óà »§ ³Ì Ðò ÄÜ ¹» ²¶ ×½ µ½ µÄ¡° Òì ³£¡± Çé ¿ö¡£ ÎÒ ÃÇ ½« ͨ ¹ý ²ú Éú Ëü µÄ ×Ó Àà À´ ´´ ½¨ ×Ô ¼º µÄ¡° Òì ³£¡±¡£ Áí Ò» Àà ÊÇError£¬ Ëü ¶¨ Òå ÁË ÄÇ Ð© ͨ ³£ ÎÞ ·¨ ²¶ ×½ µ½ µÄ¡° Òì ³£¡±¡£ Òª ½÷ É÷ ʹ ÓÃError×Ó À࣬ Òò Ϊ Ëü ÃÇ Í¨ ³£ »á µ¼ Ö ÔÖ ÄÑ ÐÔ µÄ ʧ °Ü¡£ ÔÚExceptionÖÐ ÓÐ Ò» ¸ö ×Ó ÀàRuntimeException£¬ Ëü ÊÇ ³Ì Ðò ÔË ÐРʱ ×Ô ¶¯ µØ ¶Ô ij Щ ´í Îó ×÷ ³ö ·´ Ó¦ ¶ø ²ú Éú µÄ¡£
¡° Òì ³£¡± ¶Ô Ïó ÊÇJavaÔÚ ÔË ÐРʱ ¶Ô ij Щ¡° Òì ³£¡± Çé ¿ö ×÷ ³ö ·´ Ó¦ ¶ø ²ú Éú µÄ¡£ Àý È磬 ÏÂ Ãæ Õâ ¸ö С ³Ì Ðò °ü º¬ Ò» ¸ö Õû Êý ±»0³ý µÄ¡° Òì ³£¡±¡£
class Exc0 { public static void main(String args[]) { int d = 0; int a = 42/d; } }
µ±JavaÖ´ ÐÐ Õâ ¸ö ³ý ·¨ ʱ£¬ ÓÉ ÓÚ ·Ö ĸ ÊÇ0£¬ ¾Í »á ¹¹ Ôì Ò» ¸ö¡° Òì ³£¡± ¶Ô Ïó À´ ʹ ³Ì Ðò Í£ Ï À´ ²¢ ´¦ Àí Õâ ¸ö ´í Îó Çé ¿ö£¬ ÔÚ ÔË ÐРʱ¡° Å× ³ö¡±£¨throw£© Õâ ¸ö¡° Òì ³£¡±¡£ ˵¡° Å× ³ö¡± ÊÇ Òò Ϊ Ëü Ïó Ò» ¸ö ¹ö ÌÌ µÄ Âí Áå Êí£¬ Äã ±Ø Ðë °Ñ Ëü ×¥ ס ²¢ Á¢ ¼´ ´¦ Àí¡£ ³Ì Ðò Á÷ ½« »á ÔÚ ³ý ºÅ ²Ù ×÷ ·û ´¦ ±» ´ò ¶Ï£¬ È» ºó ¼ì ²é µ± ǰ µÄ µ÷ Óà ¶Ñ Õ» À´ ²é ÕÒ¡° Òì ³£¡±¡£ Ò» ¸ö¡° Òì ³£¡± ´¦ Àí Æ÷ ÊÇ Óà À´ Á¢ ¼´ ´¦ Àí¡° Òì ³£¡± Çé ¿ö µÄ¡£ ÔÚ Õâ ¸ö Àý ×Ó À ÎÒ ÃÇ Ã» ÓÐ ±à Ò» ¸ö¡° Òì ³£¡± ´¦ Àí Æ÷£¬ Ëù ÒÔ È± Ê¡ µÄ ´¦ Àí Æ÷ ¾Í ·¢ »Ó ×÷ Óà ÁË¡£ ȱ Ê¡ µÄ ´¦ Àí Æ÷ ´ò Ó¡ExceptionµÄ ×Ö ·û ´® Öµ ºÍ ·¢ Éú ¡° Òì ³£¡± µÄ µØ µã¡£ ÏÂ Ãæ ÊÇ ÎÒ ÃÇ µÄ С Àý ×Ó µÄ Êä ³ö¡£
C:\>java Exc0 java.lang.arithmeticException: / by zero at Exc0.main(Exc0.java:4)
ͨ ³£ ÎÒ ÃÇ Ï£ Íû ×Ô ¼º À´ ´¦ Àí¡° Òì ³£¡± ²¢ ¼Ì Ðø ÔË ÐС£ ¿É ÒÔ ÓÃtryÀ´ Ö¸ ¶¨ Ò» ¿é Ô¤ ·À Ëù ÓС° Òì ³£¡± µÄ µÄ ³Ì Ðò¡£ ½ô ¸ú ÔÚtry³Ì Ðò ºó Ãæ£¬ Ó¦ °ü º¬ Ò» ¸öcatch×Ó ¾ä À´ Ö¸ ¶¨ Äã Ïë Òª ²¶ ×½ µÄ¡° Òì ³£¡± µÄ Àà ÐÍ¡£ Àý È磬 ÏÂ Ãæ µÄ Àý ×Ó ÊÇ ÔÚ Ç° Ãæ µÄ Àý ×Ó µÄ »ù´¡ÉÏ ¹¹ Ôì µÄ£¬ µ« Ëü °ü º¬ Ò» ¸ötry³Ì Ðò ¿é ºÍ Ò» ¸öcatch×Ó ¾ä¡£
class exc1 { public static void main(string args[]) { try { int d = 0; int a = 42 / d; } catch (arithmeticexception e) { system.out.println("division by zero"); } } }
catch×Ó ¾ä µÄ Ä¿ ±ê ÊÇ ½â ¾ö¡° Òì ³£¡± Çé ¿ö£¬ °Ñ Ò» Щ ±ä Á¿ Éè µ½ ºÏ Àí µÄ ×´ ̬£¬ ²¢ Ïó û ÓÐ ³ö ´í Ò» Ñù ¼Ì Ðø ÔË ÐС£ Èç ¹û Ò» ¸ö ×Ó ³Ì Ðò ²» ´¦ Àí ij ¸ö¡° Òì ³£¡±£¬ Ôò ·µ µ½ ÉÏ Ò» ¼¶ ´¦ Àí£¬ Ö± µ½ ×î Íâ Ò» ¼¶¡£
ÔÚ Ä³ Щ Çé ¿ö Ï£¬ ͬ Ò» ¶Î ³Ì Ðò ¿É ÄÜ ²ú Éú ²» Ö¹ Ò» ÖÖ¡° Òì ³£¡± Çé ¿ö¡£ Äã ¿É ÒÔ ·Å Öà ¶à ¸öcatch×Ó ¾ä£¬ Æä ÖРÿ Ò» ÖÖ¡° Òì ³£¡± Àà ÐÍ ¶¼ ½« ±» ¼ì ²é£¬ µÚ Ò» ¸ö Óë Ö® Æ¥ Åä µÄ ¾Í »á ±» Ö´ ÐС£ Èç ¹û Ò» ¸ö Àà ºÍ Æä ×Ó Àà ¶¼ ÓÐ µÄ »°£¬ Ó¦ °Ñ ×Ó Àà ·Å ÔÚ Ç° Ãæ£¬ ·ñ Ôò ½« ÓÀ Ô¶ ²» »á µ½ ´ï ×Ó Àà¡£ ÏÂ Ãæ ÊÇ Ò» ¸ö ÓÐ Á½ ¸öcatch×Ó ¾ä µÄ ³Ì Ðò µÄ Àý ×Ó¡£
class MultiCatch { public static void main(String args[]) { try { int a = args.length; System.out.println("a = " + a); int b = 42/a; int c[] = {1}; c[42] = 99; } catch(ArithmeticException e) { System.out.println("div by 0: " + e); } catch(ArrayIndexOutOfBoundsException e) { system.out.println("array index oob: " + e); } } }
Èç ¹û ÔÚ ³Ì Ðò ÔË ÐРʱ ²» ¸ú ²Î Êý£¬ ½« »á Òý Æð Ò» ¸ö0×ö ³ý Êý µÄ¡° Òì ³£¡±£¬ Òò ΪaµÄ Öµ Ϊ0¡£ Èç ¹û ÎÒ ÃÇ Ìá ¹© Ò» ¸ö Ãü Áî ÐÐ ²Î Êý£¬ ½« ²» »á ²ú Éú Õâ ¸ö¡° Òì ³£¡±£¬ Òò ΪaµÄ Öµ ´ó ÓÚ0¡£ µ« »á Òý Æð Ò» ¸ö ArrayIndexOutOfBoundexceptionµÄ¡° Òì ³£¡±£¬ Òò Ϊ Õû ÐÍ Êý ×écµÄ ³¤ ¶È ÊÇ1£¬ È´ ¸øc[42]¸³ Öµ¡£ ÏÂ Ãæ ÊÇ ÒÔ ÉÏ Á½ ÖÖ Çé ¿ö µÄ ÔË ÐÐ ½á ¹û¡£
C:\>java MultiCatch a = 0 div by 0: java.lang.arithmeticexception: / by zero C:\>java MutiCatch 1 a = 1 array index oob: java.lang.ArrayIndexOutOfBoundsException:42
Äã ¿É ÒÔ ÔÚ Ò» ¸ö ³É Ô± º¯ Êý µ÷ Óà µÄ Íâ Ãæ д Ò» ¸ötryÓï ¾ä£¬ ÔÚ Õâ ¸ö ³É Ô± º¯ Êý ÄÚ ²¿£¬ д Áí Ò» ¸ötryÓï ¾ä ±£ »¤ Æä Ëû ´ú Âë¡£ ÿ µ± Óö µ½ Ò» ¸ötryÓï ¾ä£¬¡° Òì ³£¡± µÄ ¿ò ¼Ü ¾Í ·Å µ½ ¶Ñ Õ» ÉÏ Ãæ£¬ Ö± µ½ Ëù ÓÐ µÄtryÓï ¾ä ¶¼ Íê ³É¡£ Èç ¹û Ï һ ¼¶ µÄtryÓï ¾ä û ÓÐ ¶Ô ij ÖÖ¡° Òì ³£¡± ½ø ÐÐ ´¦ Àí£¬ ¶Ñ Õ» ¾Í »á Õ¹ ¿ª£¬ Ö± µ½ Óö µ½ ÓÐ ´¦ Àí Õâ ÖÖ¡° Òì ³£¡± µÄtryÓï ¾ä¡£ ÏÂ Ãæ ÊÇ Ò» ¸ötryÓï ¾ä Ƕ Ì× µÄ Àý ×Ó¡£
class MultiNest { static void procedure() { try { int c[] = { 1 }: c[42] = 99; } catch(ArrayIndexOutOfBoundsexception e) { System.out.println("array index oob: " + e); } } public static void main(String args[]) { try { int a = args.length; system.out.println("a = " + a); int b = 42/a; procedure(); } catch(arithmeticException e) { System.out.println("div by 0: " + e); } } }
³É Ô± º¯ ÊýprocedureÀï ÓÐ ×Ô ¼º µÄtry/catch¿Ø ÖÆ£¬ Ëù ÒÔmain²» Óà ȥ ´¦ Àí ArrayIndexOutOfBoundsException¡£
throwÓï ¾ä Óà À´ Ã÷ È· µØ Å× ³ö Ò» ¸ö¡° Òì ³£¡±¡£ Ê× ÏÈ£¬ Äã ±Ø Ðë µÃ µ½ Ò» ¸öThrowableµÄ ʵ Àý µÄ ¿Ø ÖÆ ±ú£¬ ͨ ¹ý ²Î Êý ´« µ½catch×Ó ¾ä£¬ »ò Õß ÓÃnew²Ù ×÷ ·û À´ ´´ ½¨ Ò» ¸ö¡£ ÏÂ Ãæ ÊÇthrowÓï ¾ä µÄ Í¨ ³£ ÐΠʽ¡£
throw ThrowableInstance;
³Ì Ðò »á ÔÚthrowÓï ¾ä ºó Á¢ ¼´ ÖÕ Ö¹£¬ Ëü ºó Ãæ µÄ Óï ¾ä Ö´ ÐÐ ²» µ½£¬ È» ºó ÔÚ °ü º¬ Ëü µÄ Ëù ÓÐtry¿é ÖÐ ´Ó Àï Ïò Íâ Ѱ ÕÒ º¬ ÓÐ Óë Æä Æ¥ Åä µÄcatch×Ó ¾ä µÄtry¿é¡£ ÏÂ Ãæ ÊÇ Ò» ¸ö º¬ ÓÐthrowÓï ¾ä µÄ Àý ×Ó¡£
class ThrowDemo { static void demoproc() { try { throw new NullPointerException("de3mo"); } catch(NullPointerException e) { System.out.println("caught inside demoproc"); throw e; } } public static void main(String args[]) { try { demoproc(); } catch(NullPointerException e) { system.out.println("recaught: " + e); } } }
throwsÓà À´ ±ê Ã÷ Ò» ¸ö ³É Ô± º¯ Êý ¿É ÄÜ Å× ³ö µÄ ¸÷ ÖÖ¡° Òì ³£¡±¡£ ¶Ô ´ó ¶à ÊýException×Ó Àà À´ ˵£¬Java ±à Òë Æ÷ »á Ç¿ ÆÈ Äã Éù Ã÷ ÔÚ Ò» ¸ö ³É Ô± º¯ Êý ÖÐ Å× ³ö µÄ¡° Òì ³£¡± µÄ Àà ÐÍ¡£ Èç ¹û¡° Òì ³£¡± µÄ Àà ÐÍ ÊÇError»ò RuntimeException£¬ »ò Ëü ÃÇ µÄ ×Ó À࣬ Õâ ¸ö ¹æ Ôò ²» Æð ×÷ Ó㬠Òò Ϊ Õâ Щ ÔÚ ³Ì Ðò µÄ Õý ³£ ²¿ ·Ö ÖÐ ÊÇ ²» ÆÚ ´ý ³ö ÏÖ µÄ¡£ Èç ¹û Äã Ïë Ã÷ È· µØ Å× ³ö Ò» ¸öRuntimeException£¬ Äã ±Ø Ðë ÓÃthrowsÓï ¾ä À´ Éù Ã÷ Ëü µÄ Àà ÐÍ¡£ Õâ ¾Í ÖØ Р¶¨ Òå ÁË ³É Ô± º¯ Êý µÄ ¶¨ Òå Óï ·¨£º
type method-name(arg-list) throws exception-list { }
ÏÂ Ãæ ÊÇ Ò» ¶Î ³Ì Ðò£¬ Ëü Å× ³ö ÁË Ò» ¸ö¡° Òì ³£¡±£¬ µ« ¼È û ÓÐ ²¶ ×½ Ëü£¬ Ò² û ÓÐ ÓÃthrowsÀ´ Éù Ã÷¡£ Õâ ÔÚ ±à Òë ʱ ½« ²» »á ͨ ¹ý¡£
class ThrowsDemo1 { static void procedure( ) [ System.out.println("inside procedure"); throw new IllegalAccessException("demo"); } public static void main(String args[]) { procedure( ); } }
Ϊ ÁË Èà Õâ ¸ö Àý ×Ó ±à Òë ¹ý È¥£¬ ÎÒ ÃÇ Ðè Òª Éù Ã÷ ³É Ô± º¯ ÊýprocedureÅ× ³ö ÁËIllegalAccessException£¬ ²¢ ÇÒ ÔÚ µ÷ Óà Ëü µÄ ³É Ô± º¯ ÊýmainÀï ²¶ ×½ Ëü¡£ ÏÂ Ãæ ÊÇ Õý È· µÄ Àý ×Ó£º
class ThrowsDemo { static void procedure( ) throws IllegalAccessException { System.out.println("inside procedure"); throw new IllegalAccessException("demo"); } public static void main(String args[]) { try { procedure( ); } catch (IllegalAccessException e) { System.out.println("caught " + e); } } }
ÏÂ Ãæ ÊÇ Êä ³ö ½á ¹û£º
C:\>java ThrowsDemo inside procedure caught java.lang.IllegalAccessException: demo
µ± Ò» ¸ö¡° Òì ³£¡± ±» Å× ³ö ʱ£¬ ³Ì Ðò µÄ Ö´ ÐÐ ¾Í ²» ÔÙ ÊÇ Ïß ÐÔ µÄ£¬ Ìø ¹ý ij Щ ÐУ¬ Éõ ÖÁ »á ÓÉ ÓÚ Ã» ÓÐ Óë Ö® Æ¥ Åä µÄcatch×Ó ¾ä ¶ø ¹ý Ôç µØ ·µ »Ø¡£ ÓРʱ È· ±£ Ò» ¶Î ´ú Âë ²» ¹Ü ·¢ Éú ʲ ô¡° Òì ³£¡± ¶¼ ±» Ö´ ÐÐ µ½ ÊÇ ±Ø Òª µÄ£¬ ¹Ø ¼ü ´Êfinally¾Í ÊÇ Óà À´ ±ê ʶ Õâ Ñù Ò» ¶Î ´ú Âë µÄ¡£ ¼´ ʹ Äã û ÓÐcatch×Ó ¾ä£¬finally³Ì Ðò ¿é Ò² »á ÔÚ Ö´ ÐÐ try³Ì Ðò ¿é ºó µÄ ³Ì Ðò Ö® ǰ Ö´ ÐС£ ÿ ¸ötryÓï ¾ä ¶¼ Ðè Òª ÖÁ ÉÙ Ò» ¸ö Óë Ö® Ïà Åä µÄcatch×Ó ¾ä »òfinally×Ó ¾ä¡£ Ò» ¸ö ³É Ô± º¯ Êý ·µ »Ø µ½ µ÷ Óà Ëü µÄ ³É Ô± º¯ Êý£¬ »ò Õß Í¨ ¹ý Ò» ¸ö û ²¶ ×½ µ½ µÄ¡° Òì ³£¡±£¬ »ò Õß Í¨ ¹ý Ò» ¸ö Ã÷ È· µÄreturnÓï ¾ä£¬finally×Ó ¾ä ×Ü ÊÇ Ç¡ ºÃ ÔÚ ³É Ô± º¯ Êý ·µ »Ø ǰ Ö´ ÐС£ ÏÂ Ãæ ÊÇ Ò» ¸ö Àý ×Ó£¬ Ëü ÓÐ ¼¸ ¸ö ³É Ô± º¯ Êý£¬ ÿ ¸ö ³É Ô± º¯ Êý Óà ²» ͬ µÄ ; ¾¶ ÍË ³ö£¬ µ« Ö´ ÐÐ ÁËfinally×Ó ¾ä¡£
class FinallyDemo { static void procA( ) { try { System.out.println("inside procA"); throw new RuntimeException("demo"); } finally { System.out.println("procA's finally"); } } static void procB( ) { try { System.out.println("inside procB"); return; } finally { System.out.println("procB's finally"); } } public static void main(String args[]) { try { procA( ); } catch (Exception e); procB( ); } }
ÏÂ Ãæ ÊÇ Õâ ¸ö Àý ×Ó µÄ ÔË ÐÐ ½á ¹û£º
C:\>java FinallyDemo inside procA procA's finally inside procB procB's finally
1. ¡° Òì ³£¡± Ö¸ µÄ ÊÇ ³Ì Ðò ÔË ÐРʱ ³ö ÏÖ µÄ ·Ç Õý ³£ Çé ¿ö¡£ 2. ÔÚ¡° Òì ³£¡± Àà ²ã ´Î µÄ ×î ÉÏ ²ã µÄ Àà ½ÐThrowable£¬ Ëü ÓÐ Á½ ¸ö Ö± ½Ó µÄ ×Ó ÀࣺExceptionºÍError¡£ 3. JavaµÄ¡° Òì ³£¡± ´¦ Àí ͨ ¹ý5¸ö ¹Ø ¼ü ´Ê À´ ʵ ÏÖ£ºtry£¬catch£¬throw£¬throwsºÍfinally¡£