【Android开发中最常见的39个报错与异常解决方案汇总】

  1. appcompat_v7

更新ADT至22.6.0版本之后,出现了这个库,appcompat_v7是Google自己的一个兼容包,就是一个支持库,
能让2.1以上全使用上4.0版本的界面。例如使用ActionBar,不需要再使用第三方的支持库了

  1. appcompat_v7:应用兼容包,V7说的是版本7,即android2.1,这个兼容包支持2.1版本以上系统。

  2. 最近谷歌官方将兼容jar包与某些资源文件单独拿出来建立了一个android工程,实际上是一个资源库,右击此项目进入buildpath-点击android,会发现islibrary打了勾,说明它是库。其实这个库可以被多个项目共用,库中已经包含了v7.jar包,还有一些适配性的资源,可以在开发多个项目时,将一些共用的代码,资源放入库中,方便使用。低版本ADT建立项目时没有自动生成库,不过当需要时,可以新建项目,将islibrary打钩即可。高版本ADT自动生成库,如果不需要,只需要在新建的项目上右击Properties–android–library下选中库,点击remove移除即可。
    3.当应用打包或者运行时,库会自动作为项目一部分进行打包编译。

  3. 当更新了ADT 与SDK版本后,创建项目,发现所有的配置都没有错误,且虚拟机也启动正常,就是项目头上有个 感叹号,则可以到 MainActivity文件中查看,继承的是不是Activity,若不是,则还需要引入一些包,才能成功运行程序,则建议改为 Activity

    版本提高了会出现很多兼容性问题,则最佳的处理方式就是,降低版本

【因此创建安卓项目时,兼容的最低项目如果非常低,则可能会出现异常,因此建议最低版本尽量选择4.0及以上】

【Android 新建项目时 如果最小版本 选择4.0以下就会 多出一个 appcompat_v7 的项目,但是这个项目 会报错,且也很容易出现其他的错误 异常等】

  1. 当电脑上包含了 多个 安卓开发环境时,则就会有多个 DDMS,则启动时可能会抛出 端口(port)占用的异常。解决方法为:

    在运行项目的时候,eclipse弹出提示框“Could not open Selected VM debug port (8700). Make sure you do not have another instance of DDMS
    or of the eclipse plugin running. If it’s being used by something else, choose a new port number in the preferences.”

     	在终端输入:netstat -ano | findstr "8700"
    
     		未找到占用端口。
    

解决方法:

在eclipse中,依次打开Window -> Preferences -> Android -> DDMS:如下图

把Base local debugger port 8600 修改为8601,并勾选Use ADBHOST。

  1. 图标问题,hdpi- 72px72px , mdpi-48px48px , xhdpi-96px96px ,xxdip-144px144px

  2. android switch(String)错误:Cannot switch on a value of type String for source level below 1.7

switch语句的判断条件可以接受int,byte,char,short,不能接受其他类型
只有JDK版本1.7以上才可以支持String

设置如下可解决问题:(若没有JDK1.7版,可下载一下安装)
菜单选项–》project->properties->java compiler->compiler compliance level:选1.7即可

  1. 调试安卓程序时:提示problem occurred An internal error occurred during Launching New_configuration

解决方法:
第一步:进入Run/Debug Settings窗口,有两种实现方式:1、Project -> Properties -> Run/Debug Settings:

Run/Debug Settings窗口如下:

第二步:选中上图中New_configuration后,点击Delete删除它。

第三步:再clean一下该工程就OK了。

点击OK就成功了。

  1. 手机插上电脑,打开了USB调试后,报错 ADB Interface 安装失败,或 Android驱动安装失败。
  • 【win7】

    【Win7系统安装驱动过程提示“系统找不到指定文件” (13.01.23新增案例)】

    Win7系统用户已经碰到几次在安装adb驱动时提示“系统找不到指定文件”,实际原因是系统在安装adb驱动的时候需要安装系统自带的winusb驱动,而winusb所需的winusb.sys文件是依靠inf文件的“windows cd”字段来复制文件的,有时间系统会不知道“windows cd”的位置就造成在安装过程中缺少winusb.sys文件而安装中止。

    1. 解决方案:
      找到winusb的来源路径“c:\windows\system32\DriverStore\FileRepository\winusb。inf_x86_neutral_6cb50ae9f480775b\”目录下,把Winusb.sys文件复制到“c:\windows\inf”目录下即可,然后再次安装就没有问题了。

    2. 【解决方案二】: 用驱动精灵之类的软件,安装ADB驱动。 【且安装驱动时必须要设置 usb选项为 只充电。】

       						(例如:)类型:安卓
       								名称:USB Composite Device
       								制造商:Android
       								设备描述:USB Composite Device  【Android usb 混合驱动】
      
       		 或者 直接 下载安装 对应手机型号的 adb 驱动。
      
       	【Window-->ShowView--->Device --> 就可以查看当前可用的设备了】--[尝试打开或关闭 usb选项媒体设备,可以刷新 Device]
      
       	【然后选择runConfiguration-->Always prompt to pick device(每次运行总是提示选择设备)】
      
  • 【xp】
    【ADB驱动无法安装,有几种不同的原因,解决方案也不相同。由于碰到问题多数都是windows XP系统,所以这里全部以windows XP为例。】

    1. 系统内已经存在相同的WDF版本,导致ADB 驱动无法安装

    这种情况是最常见的,电脑已经存在一个相同的WDF版本时,却又缺少相关的卸载项就会出现这个问题,表现是电脑提示安装致命错误。

解决方案:
  a. 添加一个相关版本的卸载项,以wdf1005版本为例,导入注册表卸载项。 然后再重新安装ADB驱动即可。

	  b. 升级到一个更高版本的ADB驱动也能够解决这个问题。

2.系统缺少Cryptographic Services服务,造成ADB 驱动无法安装

在少数XP系统上存在因为Cryptographic Services服务缺失导致驱动最后安装失败的情况,这是因为wdf驱动的安装依赖Cryptographic Services。

解决方案:
   导入服务的注册表键值,然后重新启动电脑再进行ADB驱动安装即可。

3. 与农行网银U-KEY存在冲突,导致ADB 驱动安装失败

安卓的ADB驱动安装时会与个别网银的U-KEY存在冲突,造成adb interface驱动无法安装,显示错误10。

解决方案:
    只能先卸载相关网上银行的相关文件和服务,然后再重新安装ADB驱动即可。

4. 供电不足引起的ADB驱动异常,致使ADB 驱动无法安装

有些台式机因为前置USB口供电不足而引起adb interface显示黄色感叹号。

解决方案:
   将手机数据线接到主机箱的后置USB接口,保持电量充足稳定,重新安装ADB驱动即可。

  1. estFeature() must be called before adding content产生原因

Caused by: Android.util.AndroidRuntimeException: requestFeature() must be called before adding content
调用android中的android.hardware.Camera来完成拍照功能,但是遇到这么一个异常。

setContentView(R.layout.main);
requestWindowFeature(Window.FEATURE_NO_TITLE);

解决方法如下:顺序换一下

requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.main);

--------------------【因此:this.requestWindowFeature(); 方法必须写在 this.setContentView(); 方法前面】----------------------

问题二:
解决requestFeature() must be called before adding content错误

Android 实现画面全屏(取消标题、取消状态栏):

  //取消标题
  this.requestWindowFeature(Window.FEATURE_NO_TITLE);
  
  this.setContentView(R.layout.logo); //Activity样式文件,一定要写在中间

  //取消状态栏
  this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_FULLSCREEN);

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:background="@color/white"
    >

    <ImageView 
    android:id="@+id/logo" 
    android:src="@drawable/logo_bg"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    
    />
    
</LinearLayout>

java.lang.RuntimeException:Unable to start activity ComponentInfo
_
这是因为:

java的执行顺序有关!目前遇到的这个问题就是因为在系统运行开始的时候就已经调用父类的构造方法,接着调用setContentView方法展示视图界面。R.layout.main是R.java资源类中的一个属性。当你在调用这个方法之后在声明Widget就会报:android.util.AndroidRuntimeException: requestFeature() must be called before adding content

所以前面的那三句中加载Activity的样式的那句代码一定要写在中间。

9 . Android开发中java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx}: java.lang.NullPointerException 错误的集中原因及解决办法

错误信息字符串:java.lang.RuntimeException: Unable to start activity ComponentInfo{com.first/com.first.Game}: java.lang.NullPointerException

一般都会在Activity onCreate()方法里的setContentView(XXX)发生此错误,网上查阅了很多原因,大概有四种重要可能的原因:

原因一:xxx的错误,若为R.layout.main 那么应该是main.xml文件中的标签 使用错误,最常见的而且编译器不会提示的错误就是 android:name 和 android:id 两者混淆,仔细检查main.xml的标签是否全部正确

原因二:在setContentView(view)方法之后使用了requestWindowFeature()方法,并且在此错误下面会提示requestFeature必须在setContentView之前使用,只需要把requestWindowFeature()方法放在setContentView(view)方法之前就可以解决

原因三:在onCreate()方法之外,并且不属于任何一个方法体内直接给某控件findById(R.id.xx)所导致,需要在某方法内并且在setContentView(view)方法之前进行findById(R.id.xx)即可解决

原因四:在setContentView(view)之前没有对view进行实例化,只进行了声明而直接 setContentView(view) 所导致,仔细检查view是否setContentView(view)调用之前并在方法内进行实例化即可解决

原因五:因为发生了空指针的错误异常,所以你应该检查一下比如 Spinner 或者 list 这类的东西里面是否有值存在

  1. 错误解决: java.lang.SecurityException: Permission Denial [权限拒绝]

【当别的应用内调用你某个程序的Activity有时候会发生这个错误】:

java.lang.SecurityException: Permission Denial: starting Intent { cmp=com.siveco.bluebee.phone.supervisor/com.siveco.bluebee.core.activity.GetServerAddressActivity } from ProcessRecord{4456781 1644:com.siveco.bluebee.project.productionfeedback/10056} (pid=1774, uid=10056) not exported from uid 1044

此错误源自于以下代码。

if (APPTools.checkAPP(this.getApplicationContext(), BBA_PACKAGENAME)) {
Intent intent = new Intent();
intent.setClassName(BBA_PACKAGENAME, “com.siveco.bluebee.core.activity.GetServerAddressActivity”);
startActivityForResult(intent, REQUEST_CODE);

}

解决方案: 可以在Activity中配置属性exported=“true”


  1. 异常信息: you must resert adb
    解决方案:DDMS–>点击Device窗口的 小倒三角,选择Reset adb

  2. The method onClick(View) of type new View.OnClickListener(){} must override a superclass

    mButton1.setOnClickListener(new Button.OnClickListener()
    {
    @Override
    public void onClick(View v)
    {
    // TODO Auto-generated method stub
    mTextView1.setText(“Hi, Everyone!!”);
    }
    });

上述代码报错如下

  • implements android.view.View.OnClickListener.onClick
  • The method onClick(View) of type new View.OnClickListener(){} must override a superclass

查找后发现是jdk版本问题 项目属性---->javaCompiler中的complier compliance level 将1.5改为1.6 即可

因为【在jdk1.6时才能这样写,否则就不能写@Override,因为1.6以下不支持实现接口中的方法时 使用@Override 】

  1. 使用SQLite数据库时:android.database.sqlite.SQLiteException: Can’t downgrade database from version 2 to 1

    解决方案:原来已经有这个数据库了,并且版本是2,你用version为1的去操作,所以出了问题。

          你要是没改数据库就用2,改了就增加1,写成3.
    
  2. 运行程序时----【Activity not started, its current task has been brought to the front】

运行错误:【Activity not started, its current task has been brought to the front 】。

原因分析:因为你的模拟器中还有东西在运行,也就是你要运行的activity已经有一个在模拟器中运行了。不要以认为模拟器退出到桌面了就没有东西在跑了。在你调试的时候异常关闭的程序有可能就有activity在运行。

解释:这个不是Android平台的Bug,而是Android本身就是这样一种处理机制。

我们在Android平台下,通过返回按钮,或者程序本身的退出操作,去结束一个进程的时候,实际上Android虚拟机未必会将这个进程真正的结束掉,

在内存允许的情况下,这个程序会以缓存的形式存在Android虚拟机中。只有在内存不足的情况下时,Android系统会清理长时间不被激活的任务,

以为其他程序提供内存。

Android这样做,是为了你下一次更加快速的启动这个程序。

所以,出现楼主这种情况,是在你的程序没有发生任何变化,并且内存足够的情况下,会将上一次执行的程序,从缓存Cached状态直接放置到任务栈的顶端,则你的程序又可以继续执行了。

解决方法一: 退出目前执行的程序。。

解决方案二: project--->clean , 让程序重新编译一下就行
  1. 在命令行使用 adb,ddms,sqlite 等 命令时 :保存 xxx 既不是内部命令也不是可执行文件。

解决方案:SDK安装目录下有个 platform-tools 目录,位置配置到 path系统变量中。

  1. 监听短信
要使自己写的android程序能够收到短信息来临的广播,则不管是在java程序中注册broadcastReceiver还是在manifest.xml中注册,在manifest.xml文件中必须添加一句代码:

并且该代码是和application平级的,也就是说是manifest的直接子标签.如果没有改句,即使程序中注册过广播接收,同样也收不到短信的。

【且权限注册语句,必须写在application标签前面,而不是后面,否则抛出:Permission Denial: receiving Intent { xxx} 警告】

  1. eclipse [SDK Manager] ‘xcopy’ 不是内部或外部命令,也不是可运行的程序。

Eclipse启动SDK Manager报错:[SDK Manager] ‘xcopy’ 不是内部或外部命令,也不是可运行的程序。
解决方法,在path环境变量下加上C:\WINDOWS\system32;或将C:\WINDOWS\system32\xcopy.exe拷贝到android sdk目录的tools下面即可正常运行。

  1. Android开发报错:Failed to execute tools\android.bat(或:运行SDK Manager.exe失败) 解决方案:

解决方法是:

1.找到sdk目录下的temp文件夹,它是用来暂存数据的。

2.temp文件夹里找到tools_r24.1.2-windows.zip,或者其他的tools_r***-windows.zip(建议选最新的),解压它得到一个tools文件夹

3.将刚解压的tools文件夹内容(里面有android.bat)全部复制到本身的tools文件夹,即sdk/tools,可以了。


20.如果打开SDK Manager 发现没有新版的API或者显示不全。则可以考虑更新 Android SDK Tools :仍然在SDKManager中进行更新 即可

  1. 如果在Windows命令行输入adb发现 既不是内部。。。。也不是。。。 :

    解决方案:
    例如:D:\Study_SoftWare\adt-bundle-windows-x86_64-20140702\sdk\platform-tools
    将这个目录添加到环境变量 path中就行

  2. 在使用Java局部内部类或者匿名内部类时,若该类调用了所在方法的局部变量,则该局部变量必须使用final关键字来修饰,否则将会出现编译错误。

Cannot refer to a non-final variable i inside an inner class defined in a different method

解决方案:【在外部定义一个成员变量,用来存储局部变量的值,然后在匿名内部类中直接使用成员变量即可。】      
  1. 子线程中更新主线程界面报出异常:android.view.ViewRoot$CalledFromWrongThreadException
    Only the original thread that created a view hierarchy can touch its views

解决方案一:利用Android的 Handler机制,在子线程中发送信息,然后在主UI线程中接收消息,然后进行处理

解决方案二:利用Activity.runOnUiThread(Runnable)
把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用。

          FusionField.currentActivity.runOnUiThread(new Runnable()   
          {  
              public void run()  
              {  
                  Toast.makeText(FusionField.currentActivity, "Success",  
                          Toast.LENGTH_LONG).show();  
              }  
    
          });  
  1. 【不能在主线程中访问网络–android.os.NetworkOnMainThreadException异常】

    解决方案1 :在子线程中访问网络。—如果还需要更新界面,则再结合handler 来实现。因为也不能在子线程中更新主界面】

    解决方案2 :使用异步机制
    ————————————————————————————————————————————————————————————————————————————————————————————————————

  2. 碰撞检测问题

在项目中使用并映入 java.awt.Rectangle类后,编译正常,但运行时抛出:

        java.lang.NoClassDefFoundError: java.awt.Rectangle


    原因:Android 底层不支持 java.awt 与,Swing,因此即使编译通过,但运行时会报错    


解决办法一:使用安卓自带的 Rect类,它直接提供了intersects方法,可以用于碰撞检测

解决办法二: 查看JDK的Rectangle源码,把构造方法与 intersects(MyRectangle r) 提取到我的 MyRectangle工具类中。
           --经检测正常可用
              
解决办法三:自己编写碰撞检测API   

————————————————————————————————————————————————————————————————————————————————————————————————

  1. :在 onCreate();方法中 ,获得控件对象的引用后(findViewById),设置监听器时发现报错:Caused by: java.lang.NullPointerException

    解决方案:1.查看find控件之前,有没有为Activity设置 this.setContentView(); 如果没有设置则会抛出空指针异常.
    

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

  1. Eclipse 安卓开发时如果:发现一些类没有源代码(Ctrl + 鼠标左键)无法查看源码 :

    解决方案: 再报错的页面中:单击 attach source 。 然后选择源代码的文件夹:

    例:D:\Study_SoftWare\adt-bundle-windows-x86_64-20140702\sdk\sources\android-19 即可

  2. 碰到的Bug1:-----【使用BaseAdapter适配器,Bean集合正常,但数据展示时所有的Item都显示相同的数据】-----

【解决方法】:
首先检查获取数据填充 Bean集合的 方法处,是否每一条数据都创建了Bean对象,而不是重复添加之前的Bean对象。
然后在

            【getView方法中 设置子控件内容时用:beans.get(position); //来获取指定位置的Bean对象,然后设置子控件内容 】

                            且记:此处不能使用循环遍历的方式设置子控件内容

【简而言之】: 1.先确保一条数据对应一个Bean对象(而不是重复添加之前的Bean对象)
2.然后确保 设置子控件内容时必须使用 beans.get(position)的方式,来获取Bean对象,(而不是循环遍历beans容器)

  1. 在对ListView(AdapterView) 进行数据刷新时调用:adapter.notifyDataSetChanged(); [发现刷新失败]

    解决方案:传给AdapterView的list指向不能被改变,需要从始至终指向同一个内存,—否则可能出现刷新失败

  2. java.lang.RuntimeException: setOnItemClickListener cannot be used with a spinner.

    意思就是说spinner不支持OnItemClickListener,因为它的实现是在AdapterView中来重写的。

    【可以用setOnItemSelectedListener 来代替】

  3. 如果查询到的数据信息在cmd命令行窗口中显示存在乱码?

    首先安卓的SQLiteDataBase默认采用的是UTF-8,而命令行窗口采用的编码方式如果不是UTF-8,则可能会出现乱码。

    解决方案:更改命令行窗口的(当前代码页)的编码方式,使之与数据库中数据的编码方式一致即可

            使用命令:chcp   936         -----修改成GBK
                             950         -----修改成繁体中文(Big5) 
                             932         -----修改成日文
                             437         -----修改成英文
                             65001       -----修改成UTF-8
    
  4. 在使用ContentProvider时发现:java.lang.SecurityException: Permission Denial: opening provider

解决方案:在AndroidManifest.xml 中给ContentProvider 的定义里面加上个android:exported=“true” 就可以了

  1. 在使用ContentProvider时发现:
    java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.

    解决方案:检查ContentProvider中的暴露出来的方法,如:query(…); 在返回Cursor前,是否把 数据库或cursor对象关闭了?

        如果关闭了,则取消关闭即可。【因为要返回cursor对象给调用者使用,因此不能调用 db.close(),或cursor.close() 】             
    
  2. Mediaplayer Should have subtitle controller already set 在使用MediaPlayer+SurfaceView播放视频时出现异常,有声音,没有画面。

解决方案:一:此程序不要使用android4.4 kitkat 来运行,经过测试android5.1运行正常

  1. 使用SVN客户端将 工作空间文件夹与SVN服务器相关联后 发现工作空间文件夹没有绿色的小对勾:

    解决方式:【进入任务管理器 先 kill explorer进程,然后开启explorer进程即可】

  2. ADB启动失败抛出错误日志(且使用 reset adb 功能也无力回天):

    'ADB server didn’t ACK
    [2017-02-09 14:29:14 - adb] * failed to start daemon *
    [2017-02-09 14:29:14 - ddms] ‘…\sdk\platform-tools\adb.exe,start-server’ failed – run manually if necessary

    解决方案:直接到电脑的任务管理器中,kill 掉所有的 adb进程,然后再重启adb即可。

  3. Gradle “manifest requires a placeholder substitution” error but manifestPlaceholders supplies a value

详细信息如下:

  AndroidManifest.xml:89:16 Error:
    Attribute uses-library#com.company.platform.${encoding}@name at AndroidManifest.xml:89:16 requires a placeholder substitution but no value for <encoding> is provided.
/Users/Company/Desktop/Checkout/android/Project/app/src/main/AndroidManifest.xml:0:0 Error:
    Validation failed, exiting

这个问题一般出现在当我们在AndroidManifest.xml文件中新增了 mate-data 时,编译报错!

解决方案:

进入 app.gradle 

    然后在 app.gradle 文件中: 为 mate-data 注入值!
      productFlavors{
        productFlavors.all{
                  flavor->
                      Map<String,Object> map=new HashMap<String,Object>()
       
                      map.put("encoding",encoding)
          
                      flavor.manifestPlaceholders.putAll(map)
          }
        }

  You need to just add to the array. You are replacing it. Do this:

  manifestPlaceholders = [encoding: "some value", version: cityVersion]
  By declaring manifestPlaceholders twice for the same flavor/build type, your are replacing the previous one. After the previous one got replaced, your build failed because the property no longer exists.
  1. BaseApplication 封装好了,但是实际上调用 BaseApplication.getAppContext() 时却返回null
public class BaseApplication extends Application {
    
    

    private static Context mContext;

    @Override
    public void onCreate() {
    
    
        super.onCreate();
        mContext = this;
    }

    public static Context getAppContext() {
    
    
        return mContext;
    }

    @Override
    public void onTerminate() {
    
    
        super.onTerminate();
        mContext = null;
    }
}

解决方案:
检查 AndroidManifest.xml 文件中 节点处是否配置了 android:name=“.base.BaseApplication” 即可!

  1. 解决strings.xml格式化占位符错误: Multiple substitutions specified in non-positional format

例: 游戏%s,作者:%s

检查后发现是string.xml中的 %s 导致编译失败,应该把%s 改成%position$s的形式。

即改为: 游戏%1 s ,作者: s,作者:%2 s,作者:s 即可

猜你喜欢

转载自blog.csdn.net/UserFrank/article/details/129298070