‘壹’ android开发怎么抛出个异常
直接throw抛出异常或者做会引起异常的操作就行了
抛出一个空指针异常
java">thrownewNullPointerException();
做除零操作(会抛出异常)
inti=1/0;
‘贰’ 在ANDROID开发过程中遇到这样的异常 请高手指点 急!!!!
换个模拟器吧。。LZ去下载一个Genymotion吧,Genymotion是公认的比较好的一款模拟器。
‘叁’ 安卓常见异常
在Java中异常机制的一些概念。写本文的目的在于方便我很长时间后若是忘了这些东西可以通过这篇文章迅速回忆起来。
1. 异常机制
1.1 异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。
1.2 传统的处理异常的办法是,函数返回一个特殊的结果来表示出现异常(通常这个特殊结果是大家约定俗称的),调用该函数的程序负责检查并分析函数返回的结果。这样做有如下的弊端:例如函数返回-1代表出现异常,但是如果函数确实要返回-1这个正确的值时就会出现混淆;可读性降低,将程序代码与处理异常的代码混爹在一起;由调用函数的程序来分析错误,这就要求客户程序员对库函数有很深的了解。
1.3 异常处理的流程
1.3.1 遇到错误,方法立即结束,并不返回一个值;同时,抛出一个异常对象
1.3.2 调用该方法的程序也不会继续执行下去,而是搜索一个可以处理该异常的异常处理器,并执行其中的代码
2 异常的分类
2.1 异常的分类
2.1.1 异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和 IOException等继承Exception,具体的RuntimeException继承RuntimeException。
2.1.2 Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。
2.2 每个类型的异常的特点
2.2.1 Error体系 Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形。应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出)。如果出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以,在进行程序设计时,应该更关注Exception体系。
2.2.2 Exception体系 Exception体系包括RuntimeException体系和其他非RuntimeException的体系
2.2.2.1 RuntimeException RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。处理RuntimeException的原则是:如果出现 RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。
2.2.2.2 其他(IOException等等)这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。
2.3 与C++异常分类的不同
2.3.1 其实,Java中RuntimeException这个类名起的并不恰当,因为任何异常都是运行时出现的。(在编译时出现的错误并不是异常,换句话说,异常就是为了解决程序运行时出现的的错误)。
2.3.2 C++中logic_error与Java中的RuntimeException是等价的,而runtime_error与Java中非RuntimeException类型的异常是等价的。
3 异常的使用方法
3.1 声明方法抛出异常
3.1.1 语法:throws(略)
3.1.2 为什么要声明方法抛出异常?方法是否抛出异常与方法返回值的类型一样重要。假设方法抛出异常确没有声明该方法将抛出异常,那么客户程序员可以调用这个方法而且不用编写处理异常的代码。那么,一旦出现异常,那么这个异常就没有合适的异常控制器来解决。
3.1.3 为什么抛出的异常一定是已检查异常? RuntimeException与Error可以在任何代码中产生,它们不需要由程序员显示的抛出,一旦出现错误,那么相应的异常会被自动抛出。而已检查异常是由程序员抛出的,这分为两种情况:客户程序员调用会抛出异常的库函数(库函数的异常由库程序员抛出);客户程序员自己使用throw语句抛出异常。遇到Error,程序员一般是无能为力的;遇到RuntimeException,那么一定是程序存在逻辑错误,要对程序进行修改(相当于调试的一种方法);只有已检查异常才是程序员所关心的,程序应该且仅应该抛出或处理已检查异常。
3.1.4 注意:覆盖父类某方法的子类方法不能抛出比父类方法更多的异常,所以,有时设计父类的方法时会声明抛出异常,但实际的实现方法的代码却并不抛出异常,这样做的目的就是为了方便子类方法覆盖父类方法时可以抛出异常。
3.2 如何抛出异常
3.2.1 语法:throw(略)
3.2.2 抛出什么异常?对于一个异常对象,真正有用的信息时异常的对象类型,而异常对象本身毫无意义。比如一个异常对象的类型是 ClassCastException,那么这个类名就是唯一有用的信息。所以,在选择抛出什么异常时,最关键的就是选择异常的类名能够明确说明异常情况的类。
3.2.3 异常对象通常有两种构造函数:一种是无参数的构造函数;另一种是带一个字符串的构造函数,这个字符串将作为这个异常对象除了类型名以外的额外说明。
3.2.4 创建自己的异常:当Java内置的异常都不能明确的说明异常情况的时候,需要创建自己的异常。需要注意的是,唯一有用的就是类型名这个信息,所以不要在异常类的设计上花费精力。
3.3 捕获异常如果一个异常没有被处理,那么,对于一个非图形界面的程序而言,该程序会被中止并输出异常信息;对于一个图形界面程序,也会输出异常的信息,但是程序并不中止,而是返回用户界面处理循环中。
3.3.1 语法:try、catch和finally(略)控制器模块必须紧接在try块后面。若掷出一个异常,异常控制机制会搜寻参数与异常类型相符的第一个控制器随后它会进入那个catch 从句,并认为异常已得到控制。一旦catch 从句结束对控制器的搜索也会停止。 3.3.1.1 捕获多个异常(注意语法与捕获的顺序)(略)
3.3.1.2 finally的用法与异常处理流程(略)
3.3.2 异常处理做什么?对于Java来说,由于有了垃圾收集,所以异常处理并不需要回收内存。但是依然有一些资源需要程序员来收集,比如文件、网络连接和图片等资源。
3.3.3 应该声明方法抛出异常还是在方法中捕获异常?原则:捕捉并处理哪些知道如何处理的异常,而传递哪些不知道如何处理的异常
3.3.4 再次抛出异常
3.3.4.1 为什么要再次抛出异常?在本级中,只能处理一部分内容,有些处理需要在更高一级的环境中完成,所以应该再次抛出异常。这样可以使每级的异常处理器处理它能够处理的异常。
3.3.4.2 异常处理流程对应与同一try块的catch块将被忽略,抛出的异常将进入更高的一级。
4 关于异常的其他问题
4.1 过度使用异常首先,使用异常很方便,所以程序员一般不再愿意编写处理错误的代码,而仅仅是简简单单的抛出一个异常。这样做是不对的,对于完全已知的错误,应该编写处理这种错误的代码,增加程序的鲁棒性。另外,异常机制的效率很差。
4.2 将异常与普通错误区分开对于普通的完全一致的错误,应该编写处理这种错误的代码,增加程序的鲁棒性。只有外部的不能确定和预知的运行时错误才需要使用异常。
4.3 异常对象中包含的信息一般情况下,异常对象唯一有用的信息就是类型信息。但使用异常带字符串的构造函数时,这个字符串还可以作为额外的信息。调用异常对象的getMessage()、toString()或者printStackTrace()方法可以分别得到异常对象的额外信息、类名和调用堆栈的信息。并且后一种包含的信息是前一种的超集。
‘肆’ android异常java.ioException:No such file or directory
/data/data/a.ioTest.test.run/
这个目录是否存在?
是否有权限在该目录创建文件?
‘伍’ android中anr异常是什么意思
ANR (“Application Not Responding”),意思是”应用没有响应“。
在如下情况下,Android会报出ANR错误:
1.主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件。
2.BroadcastReceiver 没有在10秒内完成返回。
通常情况下,下面这些做法会导致ANR:
1、在主线程内进行网络操作。
2、在主线程内进行一些缓慢的磁盘操作(例如执行没有优化过的SQL查询)。
应用应该在5秒或者10秒内响应,逻辑应该是:
1. new出一个新的线程,进行数据请求。
2. 获取数据后,调用handler.sendMessage方法。
3. 在handler的handle()方法中更新UI。
‘陆’ Android致命异常:可以问题,怎么解决
一般在报错信息的后面几行,特别和你应用程序有关的类,可以双击点入进行查看
1. Caused by: java.lang.SecurityException:Permission denied (missing INTERNET permission?)
解释:安全异常---缺少了INTERNET的权限
2.org.json.JSONException: No value for datas
解释:被JSONException捕获的异常:datas这个标签取没有值
3. Caused by: NullPointerException:***
解释:空指针异常
1)可能1:使用对对象没有开辟空间,使用的对象没有new
2)可能2:被引用的对象没有开辟空间,被使用的对象没有new
4. Caused by: OOM(
out of memory)
解释:如果当一次性加载图片的大小超过4MB的时候,会报这样的错误
5.java.lang.ClassCastException:java.lang.String cannot be cast tocom.qianfeng.gridviewfromnet.MainActivity$MyAdapter$ViewHolder
解释:类型转换错误,String不能被转换成MyAdapter里的ViewHolder
6.Caused
by:android.content.ActivityNotFoundException: Unable to find explicit
activityclass{com.qianfeng.day41_gridviewicon/com.qianfeng.day41_gridviewicon.GridViewActivity};have
you declared this activity in your AndroidManifest.xml?
解释:没有去清单文件申明指定的activity
7.java.lang.IllegalStateException:Could
not find a method btnClick(View) in the activity
classcom.qianfeng.day41_dialoglist.MainActivity
for onClick handler on view classandroid.widget.Button with id
'btn_normallist'
解释:是这id:btn_normallist的button没有在代码里找到btnClick(View)
8.android.content.res.Resources$NotFoundException:String resource ID #0x0
解释:资源的地址没有被找到
可能:设置的参数应该是0x....的地址,但实际却被赋值了
9. java.lang.IndexOutOfBoundsException:Invalid index 3, size is 2
解释:数组下标越界
10.android.view.WindowManager$BadTokenException:Unable to add window -- token null is not valid; is your activity running?
解释:你的Activity没有完全的运行起来,却在window窗口去显示popUpMenu
‘柒’ 捕获到异常怎么处理android就不会挂掉
UncaughtExceptionHandler接口
这个接口,顾名思义,就是处理程序中没有处理的异常,而且是在系统抛出异常导致程序异常终止之前哦!
1. 首先,咱们得创建一个UncaughtExceptionHandler的具体类,比如:
复制内容到剪贴板
代码:
public class CrashHandler implements UncaughtExceptionHandler {
private static CrashHandler instance; //单例引用,这里我们做成单例的,因为我们一个应用程序里面只需要一个UncaughtExceptionHandler实例
private CrashHandler(){}
public synchronized static CrashHandler getInstance(){ //同步方法,以免单例多线程环境下出现异常
if (instance == null){
instance = new CrashHandler();
}
return instance;
}
public void init(Context ctx){ //初始化,把当前对象设置成UncaughtExceptionHandler处理器
Thread.(this);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) { //当有未处理的异常发生时,就会来到这里。。
Log.d("Sandy", "uncaughtException, thread: " + thread
+ " name: " + thread.getName() + " id: " + thread.getId() + "exception: "
+ ex);
String threadName = thread.getName();
if ("sub1".equals(threadName)){
Log.d("Sandy", ""xxx);
}else if(){
//这里我们可以根据thread name来进行区别对待,同时,我们还可以把异常信息写入文件,以供后来分析。
}
}
}
2. 其次,我们自定义Application类
复制内容到剪贴板
代码:
public class OurApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
CrashHandler handler = CrashHandler.getInstance();
handler.init(getApplicationContext()); //在Appliction里面设置我们的异常处理器为UncaughtExceptionHandler处理器
}
}
3. 配置AndroidManifest.xml文件
由于我们使用自定义的Application,所以我们要在AndroidManifest.xml文件中申明它
复制内容到剪贴板
代码:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:name=".OurApplication"
android:debuggable="true"
>
4. 测试
我们在Activity里面启动一个线程,然后线程里面抛出一个异常,看看程序会怎么样
复制内容到剪贴板
代码:
Button btn = (Button) findViewById(R.id.bt);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Log.d("Sandy", "I am a sub thread");
String s = null;
s.toString(); //抛出NullPointException
}
}, "sub thread");
thread.start();
}
5. 结果
由于我们有默认未处理异常的处理程序,所以会打印下面的日志信息,而不会抛出异常导致程序异常终止
D/Sandy ( 2228): I am a sub thread
D/Sandy ( 2228): uncaughtException, thread: Thread[sub thread,5,main] name: sub thread id: 148exception: java.lang.NullPointerException
大家还等什么呢?赶紧在自己的应用里面添加上默认未处理异常处理器吧!再也不会因为异常未捕获发生程序崩溃了。。^_^
‘捌’ android异常java.lang.ExceptionInInitializerError
mContext本来就等于null, 因为你没有初始化instance, 在你的静态函数里改一改吧。
if (instance == null) return new MyApplication();
else return instance;
‘玖’ android indexoutofboundsexception是什么异常
android indexoutofboundsexception是下表越界的异常,比如 int []a ={1,2} ,错误的写成a[2]就会报错,因为数组下表是从0开始的
‘拾’ Android 全局异常是什么意思
Android系统的“程序异常退出”,给应用的用户体验造成不良影响。为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理。通过Thread.()方法将异常处理类设置到线程上即可。
1、异常处理类,代码如下:
[java] view plain
public class CrashHandler implements UncaughtExceptionHandler {
public static final String TAG = "CrashHandler";
private static CrashHandler INSTANCE = new CrashHandler();
private Context mContext;
private Thread.UncaughtExceptionHandler mDefaultHandler;
private CrashHandler() {
}
public static CrashHandler getInstance() {
return INSTANCE;
}
public void init(Context ctx) {
mContext = ctx;
mDefaultHandler = Thread.();
Thread.(this);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
// if (!handleException(ex) && mDefaultHandler != null) {
// mDefaultHandler.uncaughtException(thread, ex);
// } else {
// android.os.Process.killProcess(android.os.Process.myPid());
// System.exit(10);
// }
System.out.println("uncaughtException");
new Thread() {
@Override
public void run() {
Looper.prepare();
new AlertDialog.Builder(mContext).setTitle("提示").setCancelable(false)
.setMessage("程序崩溃了...").setNeutralButton("我知道了", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.exit(0);
}
})
.create().show();
Looper.loop();
}
}.start();
}
/**
* 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. 开发者可以根据自己的情况来自定义异常处理逻辑
*
* @param ex
* @return true:如果处理了该异常信息;否则返回false
*/
private boolean handleException(Throwable ex) {
if (ex == null) {
return true;
}
// new Handler(Looper.getMainLooper()).post(new Runnable() {
// @Override
// public void run() {
// new AlertDialog.Builder(mContext).setTitle("提示")
// .setMessage("程序崩溃了...").setNeutralButton("我知道了", null)
// .create().show();
// }
// });
return true;
}
}
2、线程绑定异常处理类
[java] view plain
public class CrashHandlerActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(this); //传入参数必须为Activity,否则AlertDialog将不显示。
// 创建错误
throw new NullPointerException();
}
}