2012-11-06 84 views
0
File f = new File(fullPath);    
long freeSpace = f.getFreeSpace(); 

我在Android應用程序中使用上面的代碼片段。 我的應用程序編譯良好,用sdk-15 jar。爲什麼NoSuchMethodError異常拋出如果API-jar有這種方法和實現

Android手機在哪裏運行應用程序是升級Froyo

我獲得以下運行時錯誤

 java.lang.NoSuchMethodError: java.io.File.getFreeSpace 

我擡頭的文檔的getFreeSpace(),並自API-9,它說。 據我所知froyo符合API-8(和以上,我猜?) 所以我知道(但不太明白),我不能在平臺froyo上調用此函數,但我可以在平臺上調用它上述API-8

所以我的問題/模糊性是這樣的

考慮到應用程序編譯完全沒有問題,我會承擔這一職能f.getFreeSpace()和它的實現提供API-15的罐子我正在使用。 當我的應用程序使用API​​-15的jar文件進行編譯時,爲什麼android會拋出運行時異常,並且它應該在jar中實現getFreeSpace()?如果API-15 jar中的實現存在,爲什麼平臺Froyo-API-8會造成問題? ?

+0

的東西失去了從早期重新設計的一部分,並不總是api8,這就是爲什麼 – njzk2

+0

以及你如何預計froyo會知道api 15? – njzk2

+0

你或多或少地回答了你自己的問題。'getFreeSpace'是在API-9中引入的,並且在API-8上出現錯誤,該錯誤比此更早。您在API-15中編譯它的事實是無關緊要的,因爲運行時的API級別是系統上可用的任何級別。 –

回答

2

我會假設,功能f.getFreeSpace()和它的實現是在API-15的罐子可裏面我是用

「的API-15罐子」是不是你認爲是。

在編譯時,您編譯的JAR不是而是的一部分。它是一系列存根類和方法,足以允許編譯進行。這些類和方法的真正實現在設備的固件中。

當我的應用程序使用API​​-15的jar文件進行編譯時,爲什麼android會拋出運行時異常,並且它應該在jar中實現getFreeSpace()?

您在編譯時使用編譯區JAR編譯時有getFreeSpace()。在API級別8設備上,運行時不會有getFreeSpace(),因爲該版本的Android中不存在該方法。

如果API-15 jar中的實現存在,爲什麼平臺Froyo-API-8會造成問題? ?

因爲你認爲「API-15 jar」只在編譯時使用,而不是在運行時使用。

過去有更多關於這方面的材料在Android開發者網站,但它似乎一直在api15在2012年

+0

感謝CommonsWare,所以如果這些api-sdk罐子只是僅用於編譯的中空存根,是否正確地認爲它根本就沒有任何區別對於我鏈接哪個api-jar至 ?只是獲得最新的一個並將其鏈接(作爲函數的超集)? - 只要我不調用我的目標平臺不支持的函數 – Ahmed

+0

@Ahmed:「假設它根本不影響我連接哪個api-jar?」是正確的嗎? - 您需要針對包含您打算在運行時直接調用的所有類和方法的API級別進行編譯。 「只要我不調用不支持我的目標平臺的函數」 - 正確。您可以使用'android.os.Build'來找出正在運行的設備的版本,這樣您就可以在安全的設備上有條件地調用新的方法。 – CommonsWare

+0

感謝CommonsWare,這是有幫助的,並從我腦海中清除了一個嚴重的誤解。發佈之前,我試圖查找Android文檔,但無法找到明確的相關信息,您的答案充分回答了我的問題但是,我想對此主題有一個詳細的瞭解,所以如果您可以分享任何文章/引用材料,我會高度欣賞它。再次感謝 – Ahmed

相關問題