logo

עומס יתר של שיטה ושגיאת null ב-Java

ב-Java מאוד נפוץ להעמיס שיטות. להלן תוכנית Java מעניינת. 

Java
public class Test {  // Overloaded methods  public void fun(Integer i)  {  System.out.println("fun(Integer ) ");  }  public void fun(String name)  {  System.out.println("fun(String ) ");  }  // 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("fun(Integer ) ");  }  public void fun(String name)  {  System.out.println("fun(String ) ");  }  // 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) ויבצע את הקוד שבתוכו. הערה: בעיה זו לא תימשך כאשר הארגומנטים של השיטה שנעקפו הם מסוג נתונים פרימיטיביים. כי המהדר יבחר את השיטה המתאימה ביותר ויבצע אותה.