一、经常遇到的运行时异常(RuntimeException)类型:
空指针异常(NullPointerException);
数组越界异常(ArrayIndexOutOfBoundsException);
类型转换异常(ClassCastException);
非法声明异常(IllegalArgumentException)
SQL异常(SQLException)
二、Java 异常类型
1、 异常的种类
所有异常都由Throwable继承
Throwable 有两个子类 Error和Exception
1.1、Error -错误
1.1.1、VirtualMachineError 虚拟机异常
1、StackOverFlowError 内存泄漏
2、OutOfMemoryError 内存溢出
1.1.2、AWTError
1.2、Exception -异常
1.2.1、IOException -IO异常
1、EOFException -对象流异常。当输入过程中意外到达文件或流的末尾时
2、FileNotFoundException -文件不见异常
1.2.2、RuntimeException -运行异常
1、ArithmeticException -算数异常(分母为0)
2、 MissingResourceException -读取不到资源文件的异常
3、ClassNotFoundException -文件没有找到异常
4、NullPointerException -空指针异常
5、 IllegalArgumentException -非法声明异常
6、ArrayIndexOutOfBoundsException -数组越界异常
7、SQLException
8、UnknowTypeExceptino -
9、ClassCastException -类型转换异常
2、 VirtualMachineError 虚拟机异常
2.1 StackOverFlowError 内存泄漏
原因:当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏。
1、单例造成的内存泄漏
2、非静态内部类创建静态实例造成的内存泄漏
解决方法:将该内部类设为静态内部类或将该内部类抽取出来封装成一个单例,如果需要使用Context,就使用Application的Context
3、Handler造成的内存泄漏
解决方法:将Handler类独立出来或者使用静态内部类,这样便可以避免内存泄漏
4、线程造成的内存泄漏
解决方法:将AsyncTask和Runnable类独立出来或者使用静态内部类,这样便可以避免内存泄漏。
5、资源未关闭造成的内存泄漏
6、使用ListView时造成的内存泄漏
解决方法:在构造Adapter时,使用缓存的convertView。
解决方案:
2、对于需要在静态内部类中使用非静态外部成员变量(如:Context、View ),可以在静态内部类中使用弱引用来引用外部类的变量来避免内存泄漏。
3、对于不再需要使用的对象,显示的将其赋值为null,比如使用完Bitmap后先调用recycle(),再赋为null。
4、保持对对象生命周期的敏感,特别注意单例、静态对象、全局性集合等的生命周期。
5、对于生命周期比Activity长的内部类对象,并且内部类中使用了外部类的成员变量,可以这样做避免内存泄漏:
1)将内部类改为静态内部类
2)静态内部类中使用弱引用来引用外部类的成员变量
2.2.2 OutOfMemoryError 内存溢出
原因:内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序行要用到的内存大于虚拟机能提供的最大内存。引起内存溢出的原因有很多种,常见的有以下几种:
1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
3.代码中存在死循环或循环产生过多重复的对象实体;
4.使用的第三方软件中的BUG;
5.启动参数内存值设定的过小;
解决方案:
第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。
第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。