一,基本概念
1,了解什么是异常,了解异常和错误的区别;
2,了解异常的分类对,对个大异常分类有基本掌握,至少要掌握五种常见的错误
3,掌握异常处理的三中方式,掌握在合适大的时机使用合适的方式
1,提前预判让异常不发生,
2,异常发生以后使用异常处理机制当场解决,
3,异常发生以后使用抛出机制交由外部调用者解决,
4,了解自定义异常的编写和使用,为第三阶段做准备
二,异常和错误
1,什么是异常(Exception),
1,是程序执行中所产生的问题。
2,在程序代码中出现的能够用代码解决得问题,
异常分类;
检查异常、
运行异常
2,错误(Error);
硬件问题,环境的问题
三,异常
1,编译时异常
又叫检查异常(checked)
2,运行时异常
未检查异常(uncheckd)
3,异常报告的划分
1,Exception in thread “线程”;异常在哪个线程
2,Java.lang.ArithmeicEXCEPTION;异常原因 //可以去doc文档查
3,at ................;异常发生在哪里,异常的位置;
4,Exception类下边只有一个运行时异常(RuntimeExcption)运行是异常下边还有子类
5,Thorwable异常和错误的根类;thorwable下边有Error和Exception;
四,异常的处理机制
1,预判异常;
1,对于大多数异常,都应该在异常有可能出现前提前做出判断,让异常没有发生的机会!
2,要有良好的对异常的敏感度,
3,要有丰富的经验判断一场可能出现的地方。
2,try-catch语句处理异常格式;
while(){
try{
//正常逻辑代码
//但有可能出现错误
return;//跳出方法
}catch(异常1类型 变量名){
//异常发生后的处理代码
}catch(异常2类型 变量名){
//异常发生后的处理代码
}catch(Exception ex){
ex.printStacktrace();//把堆栈的异常信息打印在控制台上;
System。.out.println("出现未知异常!");
}finally{
//这里边的类容必须被执行
}
}
catch(){};当错误的解决方案不一样时就要用两个
finally{};这里边的类容必须被执行就算有break;return;continue;
ex.printStacktrace();开发时,使用它把堆栈发生的异常信息打印在控制台上;
父类异常必须写在子类异常的后边
让代码不死,也要让程序回到逻辑上;
这样开发人员在测试的时候可以知道发生了那种之前没有预见到的异常以及发生在哪儿;
运营时,会把这句代码去掉,避免用户受惊,换成日志的方式记录异常信息;
3,不处理异常;
1,thows;是关键字
写在方法声明的最后,表明给方法有可能抛出异常,多个异常中间用逗号分隔,
他的作用是警告调用者出了异常你要去处理;并不代表一定会出异常
例;
public void name() FileNotFoundException,异常2{};
2,throw关键字
我们可以主动抛异常,加throw;
写在方法里边是一句执行代码;一旦执行到这句话就一定会发生异常;
如果这个时候发生的是编译时异常,要求方法要加申明要加shrows
如果是运行时异常,则可以直接编译通过不用加shrow
例;
shrow new Exception();
3,子类不能抛出比父类更多的异常
指的是范围;父类抛两个异常,子类抛出的异常必须小于等于父类,不能大于父类抛出的异常
4,调用时异常的方法;
调用者会立马报错(其实是强制调用者在编译器就要对这些异常进行处理)
如果抛出的是运行错误则不会报错,只有编译异常才会报错。
5,自定义异常;
1,当你继承了exception就可以承认是一个异常;还要提共转换的功能
写一个类继承exception的类,在里边写一个报异常的方法;在调用父类的带参构造;
从工程使用中来说;他应该还包括自己特有的方法,比如写日志;
同时需要他们把他们捕获的所有异常转换成自定义的异常,让后网上抛,
交由界面层去统一处理,所以自定义异常还应该包括带参构造,从而实现能够转换的目的
至少提供两个带参构造,
第一个将别的异常对象装入到自己的构造中,所以要这个构造
具体的实现情况只需要调父类的
第二个构造;为了能够将自定义信息装入到自己的异常对象中(业务异常)
2,三层架构;
界面类
业务类
持久类
五,方法声明的全部类容
访问修饰符 静态修饰符 返回类型 继承 接口 方法名 参数 返回错误{}
返回错误类型会影响方法重写,