עומס יתר של שיטה ושגיאת null ב-Java
ב-Java מאוד נפוץ להעמיס שיטות. להלן תוכנית Java מעניינת.
Java public class Test { // Overloaded methods public void fun ( Integer i ) { System . out . println ( & quot ; fun ( Integer ) & quot ;); } public void fun ( String name ) { System . out . println ( & quot ; fun ( String ) & quot ;); } // Driver code public static void main ( String [] args ) { Test mv = new Test (); // This line causes error mv . fun ( null ); } }
פלט:
22: error: reference to fun is ambiguous mv.fun(null); ^ both method fun(Integer) in Test and method fun(String) in Test match 1 error
הסיבה שבגללה אנו מקבלים שגיאת זמן קומפילציה בתרחיש שלעיל היא כאן ארגומנטי השיטה Integer ו-String שניהם אינם סוגי נתונים פרימיטיביים ב-Java. זה אומר שהם מקבלים ערכים אפסים. כאשר אנו מעבירים ערך null ל-method1 המהדר מתבלבל באיזו שיטה עליו לבחור מכיוון ששניהם מקבלים את ה-null. שגיאת זמן ההידור הזו לא תתרחש אלא אם נעביר בכוונה ערך null. לדוגמה, ראה את התרחיש שלהלן שאנו עוקבים אחריו באופן כללי בזמן הקידוד.
Java public class Test { // Overloaded methods public void fun ( Integer i ) { System . out . println ( & quot ; fun ( Integer ) & quot ;); } public void fun ( String name ) { System . out . println ( & quot ; fun ( String ) & quot ;); } // Driver code public static void main ( String [] args ) { Test mv = new Test (); Integer arg = null ; // No compiler error mv . fun ( arg ); } }
פלט:
fun(Integer )
בתרחיש שלמעלה אם הערך 'arg' הוא null עקב תוצאת הביטוי אז הערך null מועבר ל-method1. כאן לא נקבל שגיאת זמן קומפילציה מכיוון שאנו מציינים שהארגומנט הוא מסוג Integer ולכן המהדר בוחר את method1(Integer i) ויבצע את הקוד שבתוכו. הערה: בעיה זו לא תימשך כאשר הארגומנטים של השיטה שנעקפו הם מסוג נתונים פרימיטיביים. כי המהדר יבחר את השיטה המתאימה ביותר ויבצע אותה.