# 异常
- 将程序执行中发生的不正常情况称为"异常"
1.Error : Java虚拟机无法解决的严重,一般不编写针对性请的代码进行处理
2.Exception : 因为编程错误或偶然的存在外在因素导致的一般性问题,可以使用针对性的代码进行处理
- 异常的解决方法
1.一旦遇到错误就终止程序的
2.在编写程序时,就考虑检测,错误消息的提示,以及错误的处理
- 异常体系结构
java.lang.Throwable
|------java.lang.Error(一般不写针对性的带啊码进行处理)
|------java.lang.Exception(可以进行异常的处理)
|------编译时异常(checked)
|------IOException
|------FileNotFoundException
|------ClassNotFoundException
|------运行时异常(unchecked)
|------NullPointException
|------ArrayIndexOutOfBoundsException
|------ClassCastException
- 异常的处理 抓抛模型
1.“抛”的过程 程序在执行的过程中,一旦出现异常,就会在异常代码处生成一个异常对象的对象
并将此对象抛出
2.“抓”的过程 可以理解为异常的处理方式 1.try-catch-finally 2.throws + 异常类型
- 异常处理方式
1.try-catch-finally
try{
// 可能出现异常的代码
}catch(异常类型1 变量名1){
//处理异常的方式1
}catch(异常类型2 变量名2){
//处理异常的方式2
}finally{
//一定会执行的代码
}
1.1 finally是可选的
1.2 一旦出现异常就去catch中匹配抛出异常的类型,一旦处理完成,再执行完finally,就跳出结构执行其后的代码
1.3 如果catch中的类型是子父类关系,子类写在前边否则报错
1.4 异常对象的处理方式 1.e.getMessage() 2.e.getStackTrace()
1.5 使用try-catch-finally将编译时异常,延迟到运行时异常
1.6 由于运行时异常比较常见,所以我们就不针对运行时异常编写try-catch-finally
2.throws + 异常类型
2.1 一旦方法体执行时,出现异常,仍然在异常代码处生一个异常对象,如果此对象满足throws类型时,就会被抛出,异常代码后续的代码也不会被执行
2.2 throws的方式只是将异常抛给了方法的调用这,并没有真正的将异常处理掉
2.3 如果父类中被重写的没有throws方式处理异常,则子类重写的方法也不能用throws只能用try-catch-finally
- 用户手动抛出异常
1. 使用throw抛出异常
2. 自定义异常类需要继承异常父类 如 public class EcDef extends RuntimeException
3. 需要重写无参构造器和带参msg构造器
- throws和throw的区别
1.throw表示抛出一个异常类的对象,生成异常对象的过程,声明在方法体内
2.throws是属于异常处理的一种方式,声明在方法的声明处
public class Test {
public static void main(String[] args) {
try {
int[] i = null;
System.out.println(i[7]);
}catch (NullPointerException e) {
// TODO: handle exception
System.out.println(e);
}
}
}
class Super{
public void method() throws IOException{};
}
class Son extends Super{
@Override
public void method() throws FileNotFoundException{};
}
public class Test {
public static void main(String[] args) {
try {
Integer i = Integer.parseInt(args[0]);
Integer j = Integer.parseInt(args[1]);
int result = ecm(i,j);
System.out.println(result);
} catch (NumberFormatException e) {
System.out.println("数据格式异常");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("缺少命令行参数");
} catch (ArithmeticException e) {
System.out.println("除零异常");
} catch (EcDef e) {
System.out.println("分母或分子为负数!");
}
}
public static int ecm(int i,int j) throws EcDef{
if(i < 0 || j < 0) {
throw new EcDef();
}
return i / j;
}
}
public class EcDef extends RuntimeException{
/**
*
*/
private static final long serialVersionUID = 1L;
public EcDef() {};
public EcDef(String msg) {
super(msg);
};
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sarr.cn 版权所有 赣ICP备2024042794号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务