
检查异常:
try {
FileInputStream fileInputStream = new FileInputStream("nihao");
} catch (FileNotFoundException e) {
System.out.print("文件不存在");
}
try { func(); } catch (IOException e) { } public void func() throws IOException { // 我不想处理该异常,交给调用者去处理 return; }
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); int[] a = {1, 2, 3}; System.out.print(a[6]); // 程序crash 异常抛出点,因为该异常没有任何处理,最后会交给JRE }
try { int[] a = {1, 2, 3}; System.out.print(a[6]); // 捕获异常后,不会发生crash } catch (Exception e) { e.printStackTrace(); } finally { // 会执行到 }
即使捕获异常后,非检查异常不会导致程序crash,但是仍然最好修正代码
try { } catch (RuntimeException e) { // 没有错误,因为是非检查异常 e.printStackTrace(); } finally { // 会执行到 } try { } catch (IOException e) { // 有错误,对应的try中没有抛出检查异常 e.printStackTrace(); } finally { // 会执行到 }
func(); } public void func() { throw new RuntimeException(); // 非检查异常抛出,但是没有捕获,JRE终止程序 }
3、finally块
唯一不让finally执行的方法是system.exit(),否则即使try中即使有return,不论异常有无发生都会执行,良好的编程习惯是在try中打开资源,在finally中关闭资源,发生异常时先执行catch,然后执行finally,如果catch中再抛出异常,然后再外围寻找catch,如果发生异常,没有匹配的catch,先执行finally,然后去外围寻找匹配的catch,另外finally中的return 会覆盖try 或者catch中的返回值。
4、throw
两种方法方法内部throw new Exception,public void func() throw Exception {},前者抛出异常和JRE抛出异常相同,会导致程序终止
5、异常链接
源码Thowable内有一个成员变量
private Throwable cause = this;
初始化为自己,可通过构造函数传入,表示引起该异常的异常。
public Throwable(String message, Throwable cause) {
fillInStackTrace();
detailMessage = message;
this.cause = cause;
}
这种方法可以用于异常链接,为了防止模块软件开发中出现的异常覆盖现象,如
try {
return;
} catch (RuntimeException e) {
throw new RuntimeException("nihao", e);
}
6、自定义异常
可以参考IOExption的实现,一般会提供无参,string,Throwable参数的构造函数
public class IOException extends Exception { static final long serialVersionUID = 7818375828146090155L; public IOException() { super(); } public IOException(String message) { super(message); } public IOException(String message, Throwable cause) { super(message, cause); } public IOException(Throwable cause) { super(cause); } }
常见异常有:
检查异常:EOFExption文件读取异常,文件结尾了,但是仍然继续读取文件
FileNotFoundException文件不存在异常
非检查异常:ArrithmeticException运算异常,如除数为0
ClassNotFoundException根据给定的string找不到类的异常
NullPonterException对象为空异常
IIlegalArgumentException向一个方法传递了一个不合法的参数
ArrayIndexOutOfBoundsException数组越界异常
ClassCastException强制数据类型转换异常
错误:OutOfMemoryError内存溢出, 当再申请新的内存时,虚拟机分配无法再分配新的内存,
StackOverFlowError由于当前线程的栈满了 ,也就是函数调用层级过多导致,如死递归,当栈深度超过虚拟机分配给线程的栈大小时就会出现此error