Java基础——异常处理

来源:互联网 发布:数值最优化方法 pdf 编辑:程序博客网 时间:2024/05/19 15:20

1.什么是异常
异常:非正常的,不同于平常的

程序中:代码出现错误,程序就会终止运行
异常并不是语法错误,语法错了,编译不通过,不会产生字节码文件,不能运行
--------------------------------------------------------------------------------------------
异常处理是衡量一门语言是否成熟的标准之一,主流的语言java,c++,c#支持异常处理机制
异常处理机制可以让程序有更好的容错性,使我们的代码更健壮
遗憾的是传统的c语言却没有异常,此时只能程序员通常使用方法特点返回值来表示异常情况,并且使用if语句来判断正常和非正常情况,那没有异常会带来什么问题呢?
---------------------------------------------------------------------------------------------------------------------------------
没有异常机制存在的缺陷:
1:使用方法的返回值来表示异常情况有限,无法穷举所有异常情况如下图中通过NO_OK和OK来表示异常或正常
2:异常流程和正常流程代码混合在一起,增大了程序的复杂性,可读性也不好
3:随着系统规模的不断扩大,程序的可维护性变差
//车public class Car{public static final int NO_OK=1;public static final int OK=0;public int run(){int a = 1;if(a == 2){System.out.println("车坏了");return NO_OK;}else{System.out.println("开车上班");return OK;}}}



2.异常体系error和exception

非正常情况(出现以后程序会中断)(API)
Error:一般是JVM相关的不可修复错误。
几乎所有子类都是以error结尾
Exception:程序运行中可能出现不正常的情况,可以修复
几乎所有子类都是以Exception结尾
出现异常,不要紧张,把异常的简单类名,拷贝到api中
----------------------------------------------------
常见的Error:
StackOverflowError:当应用程序递归太深而发生内存溢出时,抛出错误
常见Exception:
NullPointerException: 当应用程序试图在需要对象的地方使用 null 时,抛出该异常
ArrayIndexOutOfBoundsException 用非法索引访问数组时抛出的异常
NumberFormatException 当应用程序试图将字符串转换成一种数值类型,但该字符串不能 转换为适当格式时,抛出该异常。
-------------------------------------------------------------------------------------------
异常出现后就会导致程序中断,所以必须处理异常


3.异常的处理:捕捉异常
1.该方法不处理,而是声明抛出,又该方法的调用者处理(throws)
2.在方法中使用try-catch语句来处理异常.
-----------------------------------------------------------------------------------
try-catch来捕获单个异常:
try{
//编写可能会出现异常的代码
}catch(异常类型A e){ //当try中出现A类型异常,就用该catch来捕获
处理异常
//记录日志/打印异常信息/继续抛出异常
}catch(异常类型B e){ //当try中出现B类异常,就用该catch来捕获
处理异常
//记录日志/打印异常信息/继续抛出异常
}
注意:1.一个catch语句只能捕获一种类型的异常,需要捕获多种异常,就得使用多个catch语句
2.代码在一瞬间只能出现一种类型的异常,只需要一个catch捕获

------------------------------------------------------------------------
如何获取异常信息:
  1. String getMessage():获取异常的描述信息,原因(提示给用户的时候)
  2. String toString():获取异常的类型和异常描述信息
  3. Void printStackTrace():打印异常的跟踪栈信息并输出控制台,不用println
包含了异常的类型,异常的原因,还包括异常出现的位置,开发和调试阶段都得使用printStackTrace

throw:运用于方法内部,用于给调用者返回一个异常处理对象,throws:运用于方法声明之上,用于表示当前方法不用处理异常,而是提醒该方法的调用者来处理异常
如: private static int divide(int num1,int num2)throws Excpetion{
}
--------------------------------------------------------------------------

Throw 语句:
运用于方法内部,抛出一个具体的异常对象:
throw new 异常类;/终止方法
--------------------------------------------------------------------------
Throw:
一般的,当一个方法出现不正常的情况的时候,我们不知道该方法应该返回什么,此时就返回一个错误,在catch语句块中继续向上抛出异常.
Return是返回一个值,throw是返回一个错误,返回给该方法的调用者.
----------------------------------------------------------------------
方法覆盖(overrider):
一同: 方法签名相同
两小:(1)子类方法返回类型和父类方法返回类型相同,或是其子类
  1. 子类方法不能声明抛出新的异常.
一大:子类方法的访问权限,必须大于等于父类方法的访问权限
----------------------------------------------------------------------
异常转译:当位于最上层的子系统不需要关系地产异常的细节时,常见的方法是捕获原始的异常,把它转换未一个新的不同类型的异常,再排除新的异常。
根据上述的例子:我的车抛锚了,我在catch中重新抛出一个异常(logicException)给我的调用者
,我们不能把异常的信息抛给老板看,因老板不关心这些细节
异常链:把原始的异常包装为新的异常类,从而形成多个异常的有序排列,有助于查找异常的根本原因


掌握异常的:
1.五个关键字:try catch finally throw throws
2.异常体系的两个继承结构:
(1)Throwable类有两个子类(error和Exception)
(2)Excetion类有一个子类:runtimeException:
runtimexception类及其子类成为runtime异常
Exception类和子类中(除了runtimeException):checked异常
(3)定义异常类。
------------------------------------------------------------------------------------------------
试问:
1.Error和exception的区别和关系
2.check的异常和runtim异常的区别
3.如何保证一段代码必须执行到(finally)
4.finally中的代码一定会执行吗?(除非退出java虚拟机)
5.finally和return执行的顺序(finally里面额两道题)
6.throw和throws的区别
7.列举5个常见的异常类:
8.列举5个常见的runtime异常类。
------------------------------------------------------------------------------------------------
ArithmeticException算数异常
NullPointerException、空指针异常
ArrayIndexOutOfBoundsException 数组索引越界
StringIndexOutOfBoundsException String操作索引越界
NumberFormatException 数字格式化异常
ClassCastException 类型强转异常
原创粉丝点击