您還可能在執行沒有公共static void main()方法的類時拋出此錯誤。要了解其背后的原因,請閱讀本文。
當您嘗試調用某個類中不再可用的方法時,那么在編譯時本身將顯示一條錯誤消息“找不到符號”。 因此,您可能會認為啟動程序或應用程序時會引發此錯誤。
我已經使用以下程序解釋了此問題背后的事實。
讓我們有一個如下的Nomethod和Pro1類,
方法類:
import java.util.*;class Nomethod{public static void main(String args[]){Pro1 s=new Pro1();s.display();}
}
Pro1類別:
class Pro1{public void display(){System.out.println("I am inside display");}
}
當您執行該程序時,它可以正常工作而不會顯示任何錯誤。現在看看當我按如下方式更改Pro1類并單獨編譯該類時會發生什么。
范例1:
class Pro1
{
}
范例2:
class Pro1{public int void display(){System.out.println("I am inside display");return 1; // for example i have included a statement like this}
}
現在,如果您執行類Nomethod而不重新編譯它,那么在運行時此java.lang.NoSuchMethodError將使您感到尷尬。
1.如果如示例1所示更改類Pro1,則將拋出此異常,因為該類中沒有可用的方法display()。
2.如果考慮使用Example2,則會引發此錯誤,因為方法display()的簽名已更改。
如果您理解了這些示例,那么您可能已經理解了執行沒有main()方法的類時引發此錯誤的原因。 真正的事實是“與現有二進制文件(類)的二進制兼容性已被新的二進制文件(修改后的類)損害了”。
“當您更改方法的簽名或刪除特定類中的方法時,并單獨對其進行編譯,那么其他調用該方法的類將不知道該方法的狀態,從而導致在運行時拋出此錯誤-時間。
同樣的情況也適用于接口,“那時,如果您嘗試更改方法的簽名或刪除接口中的方法”,也會拋出此異常。
有什么解決方案?
“如果您重新編譯了另一個類,則該類將在該類或接口中調用此修改的方法或已刪除的方法”,則此錯誤將在編譯時顯示,您可以執行必要的步驟來解決它。
注意:考慮到這種情況,即使您重新編譯該類,情況也可能變得更糟,您將不會收到此錯誤的提示。
舉例來說,您在項目中包含了較舊版本的軟件包,并將其放置在擴展庫中。您還擁有了較新的軟件包(其中方法的簽名已更改),并且您已經包含了該軟件包在課程路徑中。
編譯類時,編譯器將在擴展庫和引導程序庫中搜索類以解析引用,但Java虛擬機僅在已指定的類路徑(對于第三方庫)中搜索。
因此,在您的應用程序中使用新程序包時,請確保已修改了與舊版本相關的設置,并閱讀了新程序包的文檔以了解此程序包中所做的更改。
參考:來自Java錯誤和異常博客的JCG合作伙伴 Ganesh Bhuddhan提供的java.lang.NoSuchMethodError 。
翻譯自: https://www.javacodegeeks.com/2012/08/java-exception-java-lang.html