
рдЕрднрд┐рд╡рд╛рджрди, рдкреНрд░рд┐рдп рдкрд╛рдардХред
рдЬрд╛рд╡рд╛ рдПрдХ рд░реЛрдЪрдХ рдФрд░ рд╕реБрдВрджрд░ рднрд╛рд╖рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЗрд╕ рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рди рджреЗрдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд╛рдирдирд╛ рдЕрднреА рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рдРрд╕реЗ рдШрдЯрддрд╛, рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред
рд╕реНрд╡рдЪреНрдЫ рд╕рдВрд╣рд┐рддрд╛ рдХреЗ рдкреНрд░реЗрдореА, рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВред
рдПрдХ рдмрд╛рд░ рд╣рдм рдкрд░ рд▓реЗрдЦ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдереЗ -
рдХреИрд╕реЗ рдЬрд╛рд╡рд╛ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рдЬрд╛рд╡рд╛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде
рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ ред
рднрд╛рдЧ рез ,
рднрд╛рдЧ реирд╡реЗ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВ, рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд▓реЗрдЦрдХ рдЬрд╛рд░реА рдирд╣реАрдВ рд░рд╣рд╛ред
рдореИрдВ рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдореЗрдВ 2 рдФрд░ рдХрд╛рд░реНрдп рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ (рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рддрд╛рдХрдд рдирд╣реАрдВ рдереАред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд▓реЗрдЦ рд▓рд┐рдЦрдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред)
рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдЙрддреНрддрд░ рд╣реЛрдВрдЧреЗ, рд╕рд╛рде рд╣реА рд╕рдмрд╕реЗ рдордЬрдмреВрдд рдХреЗ рд▓рд┐рдП
рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп рднреА рд╣реЛрдВрдЧреЗ ред
рдкрд╣рд▓рд╛ рдХрд╛рдо рдЬреЛрд╢реБрдЖ рдмрд▓реЛрдЪ рдХреЗ
рдЬрд╛рд╡рд╛ рдкрдЬрд╝рд▓рд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдЕрджреНрднреБрдд рдкреБрд╕реНрддрдХ рд╕реЗ рд╕рд╛рдл-рд╕рд╛рдл рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреБрд╕реНрддрдХ рдЖрдкрдХреЛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рд╕рд┐рдЦрд╛рддреА рд╣реИ (рдмрд▓реНрдХрд┐, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдХреИрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ), рд▓реЗрдХрд┐рди рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрддрд╣рд╛рд╢рд╛ рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ред рд╕рд┐рд░реНрдл рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдПред рдореИрдВ рдЗрд╕рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рд╕реНрдерд┐рддрд┐
1. рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдорд╛рдл рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
public class A { public static class X { public static class Y { public static String Z = "life is good"; } public static CY; } public static class C { public static String Z = "life is pain"; } public static void main(String[] args) { System.out.println(XYZ); } }
рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
- рд╕рдВрдХрд▓рд┐рдд рддреНрд░реБрдЯрд┐
- рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐
- рдЬреАрд╡рди рд▓рд╛рдПрдЧрд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ
- рдЬреАрд╡рди рд▓рд╛рдПрдЧрд╛ рджрд░реНрдж рд╣реИ
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреИрд╕реЗ, рдирд╛рдо рдмрджрд▓реЗ рдмрд┐рдирд╛, [рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд░реЗрдВ рдпрджрд┐ рдЙрддреНрддрд░ 1/2 рд╣реИ рдФрд░]
рджреЛрдиреЛрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ?
2. рдЬреЗрдирд░рд┐рдХ рдРрд╕реЗ рдЬреЗрдирд░рд┐рдХ рд╣реИрдВ
public class B { public static <T> T foo() { try { return (T) new Integer(42); } catch (ClassCastException e) { return (T) "habr"; } } public static void main(String[] args) { System.out.println(B.<String>foo()); } }
рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
- рд╕рдВрдХрд▓рд┐рдд рддреНрд░реБрдЯрд┐
- рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐
- рдЖрдЙрдЯрдкреБрдЯ 42
- рдЖрдЙрдЯрдкреБрдЯ рд╣реИрдмреНрд░
рдФрд░ рдЕрдм рд╕рд╣реА рдЙрддреНрддрд░:
1. рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдорд╛рдл рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
public class A { public static class X { public static class Y { public static String Z = "life is good"; } public static CY; } public static class C { public static String Z = "life is pain"; } public static void main(String[] args) { System.out.println(XYZ); } }
рдЬреАрд╡рди рд▓рд╛рдПрдЧрд╛ рджрд░реНрдж рд╣реИрд╕рдм рдХреБрдЫ рдЬрдВрдЧрд▓реА рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд░рд▓ рд╣реИред рд╣рд╛рдВ, jls рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣рдореЗрд╢рд╛ рдореИрджрд╛рди рдкрд░ рд╣реЛрддреА рд╣реИред
рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХреИрд╕реЗ рдЬрд╛рдПрдВ рдФрд░ рдЬреАрд╡рди рдХреЛ рдЕрдЪреНрдЫреЗ рд╕реЗ рд▓рд╛рдПрдВред рдореИрдВ рддреАрди рд╕рдорд╛рдзрд╛рди рдЬрд╛рдирддрд╛ рд╣реВрдВ:
- рдкреНрд░рддрд┐рдмрд┐рдВрдм рдЕрдкреА
- рдЖрдпрд╛рдд xy
- рд╕реНрдЯреЗрдЯрд┐рдХреНрд╕ рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: (рдирдпрд╛ XY ()) Z
рд╢реАрд░реНрд╖ рдкрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд╕реНрдЯ
рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рд╡рд┐рдзрд┐ рдЕрдЪреНрдЫреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЦрд░рд╛рдм рд╣реИред рдПрдХ рдирд┐рдЬреА рдирд┐рд░реНрдорд╛рддрд╛ рдЬреЛрдбрд╝реЗрдВред рдФрд░ рдЕрдм рдХрдордЬреЛрд░? (рдкреНрд░рддрд┐рдмрд┐рдВрдм рдФрд░ рд╕реНрдереИрддрд┐рдХ рдЖрдпрд╛рдд рдХреЗ рдмрд┐рдирд╛)
public static class X { public static class Y { private Y() {} public static String Z = "life is good"; } public static CY; }
рдЙрддреНрддрд░ рд╣реИ:
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда 2. рдЬреЗрдирд░рд┐рдХ рдРрд╕реЗ рдЬреЗрдирд░рд┐рдХ рд╣реИрдВ
public class B { public static <T> T foo() { try { return (T) new Integer(42); } catch (ClassCastException e) { return (T) "habr"; } } public static void main(String[] args) { System.out.println(B.<String>foo()); } }
рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ , рдпрд╛ рдмрд▓реНрдХрд┐, рдПрдХ ClassCastException
рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЬрд╛рд╡рд╛ рдЬреЗрдирд░рд┐рдХ рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рдЬреЛ
рд╣рдорд╛рд░реА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреИрд░рд╛рдореАрдЯрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдЦреЛ рдЬрд╛рддреА рд╣реИред рдХрд╛рд╢, рдпрд╣ c ++ рдпрд╛ c # рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ред
рдХреЛрдб рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
System.out.println(B.<String>foo());
рд╕рдВрдХрд▓рдХ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рддрд░реНрдХ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдкреНрд░рд┐рдВрдЯрд▓рд╛рдЗрди рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ:
public void println(String x)
рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдУрд╡рд░рд▓реЛрдб рд╡рд┐рдзрд┐ рдХреЗ рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рд╕рдВрдХрд▓рди-рд╕реНрддрд░реАрдп рдХрд╛рд░реНрдп рд╣реИ, рди рдХрд┐ рд░рдирдЯрд╛рдЗрдоред
рдЖрдЧреЗ рдмрдврд╝реЛред
return (T) new Integer(42);
рдХрд╛рд╕реНрдЯ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдРрд╕реЗ рд╕рдордп рдореЗрдВ рдЬрдм рдЬреЗрдиреЗрд░рд┐рдХ рдирд╣реАрдВ рд░рд╣ рдЬрд╛рддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВред рдмрд╕ рдЗрдВрдЯреЗрдЧрд░ рд▓реМрдЯ рд░рд╣рд╛ рд╣реИред
рдареАрдХ рд╣реИ, рдпрд╣рд╛рдБ рд╣рдо рд╣реИрдВ - рд╣рдо рдкреНрд░рд┐рдВрдЯрдл рдХрд╣рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЗрдВрдЯреЗрдЧрд░ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ред
рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рд╕рдмрдХ
- рдРрд╕рд╛ рдордд рдХрд░реЛ
- рджреБрдирд┐рдпрд╛ рдореЗрдВ Println рд╕реЗ рдЕрдзрд┐рдХ рдРрд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ
- рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд╕реНрдЯ рдПрдХ рдмреИрд╕рд╛рдЦреА рд╣реИ
рд╢реАрд░реНрд╖ рдкрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд╕реНрдЯ
рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдЬреЛ рдПрдХ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдлреЗрдВрдХреЗ (рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдлреЗрдВрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдпрд╛ рддреЛ рдереНрд░реЛрдЬрд╝ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рдпрд╛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ:
public static void throwWithoutCheck(Throwable t) {
рдЙрддреНрддрд░ рд╣реИ:
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда private static <T extends Throwable> void castAndThrow(Throwable t) throws T { throw (T) t; } public static void throwWithoutCheck(Throwable t) { B.<RuntimeException>castAndThrow(t); }
рдпреБрдкреАрдбреА:
рдмрд┐рдирд╛ рдЬрд╛рдБрдЪ рдХрд┐рдП рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдЕрднреА рднреА рд╣реИрдВред рд╡реЗ рдПрдХ рдЬрд╡рд╛рдм рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдереЗ, рд▓реЗрдХрд┐рди, рдЖрдЗрдП, рдЕрдзрд┐рдХ "рдИрдорд╛рдирджрд╛рд░" рдХрд╣реЗрдВ:
Thread.currentThread().stop(new IOException());
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрдЯреЙрдк @deprecated рд╣реИред рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдП рд╣реИрдВ,
рдШрд╛рд╕ рд╣рд░рд┐рдпрд╛рд▓реА рд╣реЛ рдЧрдИ рд╣реИ, рдФрд░ рд╣рд╡рд╛ рдХреНрд▓реАрдирд░ рд╣реИ ред
рд╕реНрдЯреЙрдк рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рд╕реНрдЯреЙрдк рдХреЗ рд▓рд┐рдП "рдХрд╛рд░рдг" рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рдЗрд╕реЗ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдмреНрд▓реЙрдХ рдореЗрдВ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
рдУрд░рд┐рдпрдиреЙрд▓ рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред
рдпрд╛:
Unsafe.getUnsafe().throwException(new IOException());
рдпрд╣рд╛рдВ рднреА рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЕрдирд╕реЗрдл рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж
mishadoff ред