异常
本质上异常是程序上的错误,包括程序逻辑错误和系统错误
异常体系
所有异常的父类--------Throwable
- Error(不可处理)
- 运行期异常(RuntimeException)
- 非运行期异常
- Exception(可处理)
常见异常
-
IndexOutOfBoundsException
下标越界,例如数组长度为5,却操作第十位的数据
-
NullPointerExceptiopn
空指针异常,未赋值便操作
-
ArithmeticException
异常运算条件 例如:7除0
-
IllegalArgumentException
非法参数
-
ClassCastException
强制类型转换实例错误,例如:
Man extends People
Woman extends People
People person = new Man( );
Woman xx = (Woman) person;
异常处理流程
try --catch–finally(总会运行,多用于释放资源)
-
首先运行try中的代码块
-
若有异常则进行catch捕获异常,并根据异常的种类,执行不同的catch中的代码
-
无论如何最终都会运行finally中的代码
try尝试 { 需要被检测异常的代码 } catch(异常类 变量) { 处理异常的代码 } catch(异常类 变量) { 处理异常的代码 } finally最终化 { 一定会被执行的代码 }
异常处理原则
-
方法内如果抛出需要检测的异常,那么方法上必须要声明,否则必须在方法内用try-catch捕捉,否则编译失败。
-
如果调用了声明异常的函数,要么try-catch要么throws,否则编译失败。
-
.什么时候catch,什么时候throws?功能内容可以解决,用catch,解决不了,用throws告诉调用者,有调用者解决。
-
如果一个功能抛出了多个异常,那么调用时必须有对应多个catch进行针对性的处理。
异常的抛出 **throws Exception **
当我们将该类的异常直接抛出后,可以不用在此类中执行该类的try catch的异常捕获操作,进而将异常抛到执行该类的类中去进行try catch操作
public class ThrowsException {
//显示异常 必须处理,如果不在该类中处理,那就必须在调用它的类中使用
public static Date dateTransfer(String date) throws ParseException {//抛出此异常,所以此类中可有不用处理该异常
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
return simpleDateFormat.parse(date);
}
public static void main(String[] args) {
try {
System.out.println(dateTransfer("1999-02-78"));
} catch (ParseException e) {//调用了该方法,所以必须处理该异常,并且已经无法再向外抛出
e.printStackTrace();
}
}
}
throw &throws
throw为人为触发一个异常,出现在方法内部后面跟异常对象
throws为可能出现的异常,出现在方法声明上
自定义异常
可以通过extends Exception来自定义一个异常
例如下面代码展示的 AppException & SystemException
AppException code
public class AppException extends Exception {
private int ErroCode;
private String ErrorMessage;
public int getErroCode() {
return ErroCode;
}
public void setErroCode(int erroCode) {
ErroCode = erroCode;
}
public String getErrorMessage() {
return ErrorMessage;
}
public void setErrorMessage(String errorMessage) {
ErrorMessage = errorMessage;
}
public AppException(int erroCode, String errorMessage) {
ErroCode = erroCode;
ErrorMessage = errorMessage;
}
}
//TestCode============================================
public class TestException {
public static int Divide(int a,int b) throws AppException {
try{
return a/b;
}catch(Exception e){
throw new AppException(999,"AppException");//throw人为抛出一个异常,将原有的异常转化为A异常
}
}
public static void main(String[] args) {
try {
System.out.println(Divide(2,0));
} catch (AppException e) {
System.out.println(e.getErroCode());
System.out.println(e.getErrorMessage());
}
}
}
SystemException code
public class SystemException extends Exception {
private int ErroCode;
private String ErrorMessage;
public int getErroCode() {
return ErroCode;
}
public void setErroCode(int erroCode) {
ErroCode = erroCode;
}
public String getErrorMessage() {
return ErrorMessage;
}
public void setErrorMessage(String errorMessage) {
ErrorMessage = errorMessage;
}
public SystemException(int erroCode, String errorMessage) {
ErroCode = erroCode;
ErrorMessage = errorMessage;
}
public SystemException(String message, int erroCode, String errorMessage) {
super(message);
ErroCode = erroCode;
ErrorMessage = errorMessage;
}
public SystemException(String message, Throwable cause, int erroCode, String errorMessage) {
super(message, cause);
ErroCode = erroCode;
ErrorMessage = errorMessage;
}
public SystemException(Throwable cause, int erroCode, String errorMessage) {
super(cause);
ErroCode = erroCode;
ErrorMessage = errorMessage;
}
public SystemException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, int erroCode, String errorMessage) {
super(message, cause, enableSuppression, writableStackTrace);
ErroCode = erroCode;
ErrorMessage = errorMessage;
}
}
//TestCode=============================================
public class TestSys {
public static int Divide2(int a) throws SystemException {
try{
int []aaa = new int[2];
aaa[3]=a;
return aaa[3];
}catch(Exception e){
throw new SystemException(1000,"system error");
}
}
public static void main(String[] args) {
try {
System.out.println(Divide2(34));
} catch (SystemException e) {
System.out.println(e.getErroCode());
System.out.println(e.getErrorMessage());
}
}
}