記錄一下曾經遇到的坑爹的Exception,大家也可以在回帖中加入自己經常遇到的Exception以及解決辦法

1.Caused by: java.lang.ClassCastException: android.widget.TextView cannot be cast to android.widget.ButtonClassCastException:類型轉換錯誤,TextView不能轉換位Button,原因是我在findViewById的時候將TextView的一個聲明成button,還有就是講findViewById前面的(TextView)寫成(Button)


2.Caused by: java.lang.IllegalStateException: ScrollView can host only one direct child根據報錯信息提示,ScrollView控件下面必須有且只有一個子佈局,不要將ScrollView當ListView等佈局來直接在其中編寫控件,而要先在ScrollView控件中寫入LinearLayout,然後再將其他子控件寫入到LinearLayout;

3.java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called.原因是我的ListView需要addHeadView();但是我是在setAdapter()方法之後才addHeadView的,但奇怪的是,這種做法在4.0版本上都沒有報錯,在4.0版本上面報錯;


4.我在寫一個佈局文件的時候需要將一個按鈕的監聽器OnClickListener在按鈕點擊之後重新設置(也就是在OnClickListener監聽器響應之後就改變這個監聽器),在Android4.0上面這個更改過的OnClickListener在響應完一次後,又恢復到了原來的OnClickListern監聽器,但是在2.3則維持了改變後的OnCLickListener;

5.Invalid project description     
今天我在導入一個Library項目時,出現了這個提示,搜索的結果是項目中.project文件中name可能是因爲你的工程名不同而造成的我檢查後並沒有發現不同,後來想到導入Library的項目時,Library項目和導入Library的項目需要處在同一級目錄下,於是我將Library複製到workspace,這樣就好了;

今天又遇到同樣的問題,度娘和谷哥都是說項目中的.project中的name和項目名字不一樣,但我的確實不是這個問題,後來看一篇博文說的是因爲AndroidManifest.xml文件版本不同造成的,解決辦法是將項目複製到其他地方再導入即可,我將項目從workspace中複製到桌面導入,果然可以了


6.Migrate Android Code
這是我在從svn下載一個項目時遇到的,搜索的結果基本是將代碼中的switch cases 改成 if else的方式,在eclipse中可以使用 ctrl+1快捷方式切換,具體原因我還不清楚,如果你知道原因,請回復或者發我郵件,謝謝


7.Eclispe無法識別Android SDK的目錄
可以嘗試升級adt來解決這個問題


8.最新版的adt無法創建R文件
打開Android SDK Manager,勾選第一個目錄中的Anroid SDK Build-tools並下載安裝即可

9.java.lang.NullPointerException
JAVA開發和Android開發最常遇到的異常(沒有之一),每一個學JAVA的人都對他恨之入骨,由於其可能導致的原因衆多,我就講講我遇到的情況,我是因爲用map獲取一個不存在的key導致爆出空指針異常

10.java.lang.NoClassDefFoundError: com.umeng.analytics.MobclickAgent
android 植入友盟/廣告異常, ADT18對引用的jar有要求,要求jar包要放到項目下的libs裏纔可以找到,否則apk不會包含該jar包。


11.ble to execute dex: Multiple dex files define Landroid/support/v4/app/ActivityCompatHoneycomb;
libs下的android-support-v4.jar重複,將android-support-v4.jar刪除即可


12.com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper] Unable to read C:\AndroidManifest.xml: java.io.FileNotFoundException: C:\AndroidManifest.xml (系統找不到指定的文件。)
1、 
Win7 下
進入:C:\Users\(當前用戶)\.android
刪除:debug.keystore,ddms.cfg 二文件
xp
進入:C:\Documents and Settings\Administrator\.android
刪除:debug.keystore,ddms.cfg 二文件
2、
重啓 eclipse


13.[2013-06-04 09:56:29 - xxx] Re-installation failed due to different application signatures.[2013-06-04 09:56:29 - xxx] You must perform a full uninstall of the application. WARNING: This will remove the application data!
[2013-06-04 09:56:29 - xxx] Please execute 'adb uninstall com.xxxx.xxx' in a shell.
[2013-06-04 09:56:29 - xxx] Launch canceled!
原因是手機或者模擬器裏面裝了已經發布的帶有自己簽名的apk了,但是項目開發中用的是自帶的模擬debug證書,解決辦法就是英文提示所說的,刪除模擬器或手機裏面已經安裝過得項目apk,然後再run一下項目即可


14.The library 'android_xxxxxxxxx.jar' contains native libraries that will not run on the device.
在網上搜索的方法不能解決我的問題,最後在stackoverflow發現了一個解決辦法,在Eclipse上面設置,選擇windows——preferences——android——build,取消勾選改設置頁面Build Setting的第一個和第二個複選框即可
如圖所示:  

15.java.lang.NoClassDefFoundError: com.umeng.analytics.MobclickAgent
辦添加友盟sdk出現的錯誤,解決辦法是右鍵項目,選擇“Properties”,然後點擊Java Builde Path——Order and Export,將未勾選的jar包複選框勾選確定即可
如圖所示:  

16.LogCat無法輸出日誌信息
將LogCat關掉重新打開即可,點擊LogCat右邊的叉號即可關閉LogCat,然後點擊Windows——Show View,看看有沒有LogCat,有的話就選擇,LogCat就會彈出,沒有的話,點擊other,在彈出框中點擊Android文件夾,選擇LogCat即可
如果重啓LogCat還不行的話,可以重啓Eclipse


17.java.io.IOException: 您的主機中的軟件中止了一個已建立的連接。        at sun.nio.ch.SocketDispatcher.write0(Native Method)  
      at sun.nio.ch.SocketDispatcher.write(Unknown Source)  
      at sun.nio.ch.IOUtil.writeFromNativeBuffer(Unknown Source)  
      at sun.nio.ch.IOUtil.write(Unknown Source)  
      at sun.nio.ch.SocketChannelImpl.write(Unknown Source)  
      at com.android.ddmlib.JdwpPacket.writeAndConsume(JdwpPacket.java:213)  
      at com.android.ddmlib.Client.sendAndConsume(Client.java:575)  
      at com.android.ddmlib.HandleHeap.sendREAQ(HandleHeap.java:348)  
      at com.android.ddmlib.Client.requestAllocationStatus(Client.java:421)  
      at com.android.ddmlib.DeviceMonitor.createClient(DeviceMonitor.java:854)  
      at com.android.ddmlib.DeviceMonitor.openClient(DeviceMonitor.java:822)  
      at com.android.ddmlib.DeviceMonitor.processIncomingJdwpData(DeviceMonitor.java:781)  
      at com.android.ddmlib.DeviceMonitor.deviceClientMonitorLoop(DeviceMonitor.java:649)  
      at com.android.ddmlib.DeviceMonitor.access$100(DeviceMonitor.java:42)  
      at com.android.ddmlib.DeviceMonitor$3.run(DeviceMonitor.java:577)  
原因是打開了兩個Eclipse,關掉其中的一個即可

18.Failed to allocate memory: 8  This application has requested the Runtime to terminate it in an unusual way.  
Please contact the application's support team for more information. 
原因是使用的模擬器的分辨率太高了,已經超出了你電腦實際分辨率的尺寸,我創建的模擬器是pad,但是它的寬度已經超過了我電腦的實際分辨率,所以出現了這個問題。


19.sun.misc.BASE64Encoder無法導入這個方法
按說是sun的方法,jdk應該直接可以用的,但其實這個jar是jre/lib/rt.jar,我們需要右鍵項目->屬性->java bulid path->在Libraries選項下點擊jre System Library->access rules->resolution,在彈出的框裏面上面選擇accessible,下面填上** ,然後點擊確定即可,還有就是其實不推薦使用java自帶的base64方法,大家在實際項目中可以去使用apache的base64方法。

20.升級了ADT22之後報java.lang.NoClassDefFoundError錯誤
右鍵項目名稱-->>Build Path-->>Configure Build Path-->>在Order and Export中選中Android Private Libraries-->>OK
最後點擊Project-->>clean一下當前項目就ok了.
(如果還是沒有成功的話,就選中Order and Export中所有的, 然後再clean一下.)

21.騰訊微博分享更改REDIRECT_URI出錯(無法更改REDIRECT_URI
學習騰訊微博的demo,由於使用了Library庫,所以講APP_KEY、APP_KEY_SEC和REDIRECT_URI都填入到了AndroidSDK項目的src——config——config.properties中,運行一下後報錯,返回信息是errorcode:10015,這是因爲我填的REDIRECT_URI不對,然後我將原路徑的REDIRECT_URI改掉了,但是運行之後還是原來的錯誤,後來我將APP_KEY、APP_KEY_SEC和REDIRECT_URI全部換成同事申請可用的,但是在我這裏還是一開始的錯誤,我懷疑可能是bin目錄有問題,但是clean之後運行還是不行,後來發現在demo項目的Android Private Libraries下面有4個jar包,其中3個是騰訊微博所需要的,在Android_SDK.jar下面有同樣的config.properties文件,裏面的APP_KEY、APP_KEY_SEC和REDIRECT_URI是舊的,我的解決辦法就是把所有的demo中的libs中的jar全部刪除,然後直接引用libraries

22.Eclipse運行項目安裝時出現:Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE
這個錯誤的字面意思就是:“安裝失敗,內存不足”,如果是真機出現這種情況,將手機中的app刪掉幾個就可以了,如果是模擬器出現這個情況,網上的答案是使用命令行:emulator -avd MyAndroid -partition-size 120

23.今天在運行一個項目的時候出現了這個問題:Caused by: java.lang.ClassNotFoundException: android.support.v4.ViewPager
一般情況下,出現這種情況下都是因爲項目中缺少android-support-v4.jar或者沒有引用這個jar包引起的,但是當我在項目中新疆libs目錄,並拷貝android-support-v4.jar包到libs引用之後,這個問題還是不能解決,最後我在stackoverflow上面找到了解決辦法:右鍵選擇項目Project->Properties->Java Build Path than select Order and export,然後點擊右邊的TOP按鈕,將android-support-v4.jar或其所在的libraries置頂,最後clean一下項目即可運行

24.Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
出現此錯誤主要是我們使用context.startActivity()方法造成的,因爲使用Context的startActivity方法需要開啓一個新的task,增加intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);即可。


25.這是最經一段時間我在windows平臺打包常見的一個錯誤(adt升級爲22之後),困擾了我很久,終於找到了解決辦法
   控制檯提示錯誤爲:[2013-07-12 10:46:15 - xxxx] Warning: org.apache.commons.httpclient.ChunkedInputStream: can't find referenced class org.apache.commons.logging.LogFactory     。。。。
解決辦法是在項目中的proguard-project.txt文件中添加:-ignorewarnings和-libraryjars libs/xx.jar,記得將libs的所有jar包都按照這樣的格式寫
 
最後就可以正常打包了


26:java.io.IOException: Can't read [C:\Users\admin\Desktop\xxxx\libs\comments-httpclient-3.0.1.jar] (No such file or directory)
這個錯誤也是在打包的時候發生的,如同字面意義上面說的一樣,就是沒有找到comments-httpclient-3.0.1.jar這個jar,可能是項目中沒有這個文件,我遇到這個問題是因爲我在proguard-project.txt添加-libraryjars libs/comments-httpclient-3.0.1.jar時將jar包的名字寫錯了,所以導致了這個問題
解決辦法就是在proguard-project.txt中將jar包名更正即可正常打包

27.Failed to create the Java Virtual Machine
 
原因是本機內存不夠,而eclipse方法區(Perm Gen)佔用內存太多的緣故解決辦法是找到eclipse的解壓目錄中的eclipse.ini文件打開編輯,
如下圖
 另一個辦法是在eclipse.ini文件中增加jvm的完整路徑,
-vm
D:\Java\jdk1.6.0_29\bin\javaw.exe

注意這個參數的放置位置,我放在文件最下面時還是不行,放在-vmargs參數上面就可以了。
詳情請看:http://blog.csdn.net/yuanfei_1988/article/details/5919168

28.Can't bind to local 8700 for debugger
在運行項目的時候,控制檯出現如上錯誤,應該是端口問題,在Stack Ovleflow上找到解決辦法是:打開Eclipse——Windows——Preferences——Android——DDMS;
然後將Base local debugger port中的8600改爲8601,然後選中Use ADBHOST,在ADBHOST value中填127.0.0.1


29.R文件報錯,其中有一個String資源報錯
寫完demo之後發現R文件報錯,clean了之後還是報錯,然後打開R.java查看,發現只有一行報錯,然後我仔細數了一下String資源有17個,再打開自己的value/string.xml文件,發現自己的只有16個,最後一行是隻有<string name=""></string>,未定義,所以有問題,刪掉這一行就行了

30.獲取sqlite數據庫某一字段"id"只能讀取到第一行
我在寫一個數據庫查詢方法的時候出現了只能讀取一個第一個數據的情況,通過debug和對比其他語句發現,原來的在Cursor cursor = db.rawQuery(sql,null),之後沒有使用while(cursor.moveToNext()){}方法來遍歷獲取cursor中的數據,而是寫成了if(cursor.moveToNext()){}的方法,if語句只會執行一次,獲取第一條數據,然後就執行下面的語句了,而while()語句只要符合括號中的條件就會繼續執行。

31.啓動PopupWindow報NullPointerException空指針異常
代碼例子:
  1. LayoutInflater mLayoutInflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);  
  2. View view = mLayoutInflater.inflate(R.layout.music_popwindow, null);  
  3. PopupWindow mPopupWindow = new PopupWindow(view, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);  
  4. mPopupWindow.showAtLocation(findViewById(R.id.main), Gravity.RIGHT|Gravity.CENTER, 0, 0);
複製代碼
上面的代碼是一個PopupWindow的創建過程,但是我們在button的點擊事件中運行這段代碼卻會報空指針,原因在最後一行,showAtLocation(parent, gravity, x, y)方法出了問題,而報NullPointerException的地方正是parent即findViewById(R.id.main)爲空,因爲這裏根本沒有獲得PopupWindow的parent,第二行代碼的View獲取了xml佈局文件,parent應該在view中實例化,正確的代碼應該是mPopupWindow.showAtLocation(view.findViewById(R.id.main), Gravity.RIGHT|Gravity.CENTER, 0, 0);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章