异常小结
异常: java中有三种错误:
1.语法错误/编译错误:
在ide(集成开发环境)工具(eclipse,myeclipse等)
中写代码,代码写错了,在工具中用红波浪线或红叉
来表示,如果现实红波浪线,此代码是不能通过工具
进行编译的,不能编译,就不能执行
2.逻辑错误:
前提是语法没有错误,程序能编译,能运行,但结果是错误的
一般原因就是代码的逻辑写错了,最终结果也是错的
3.运行错误/异常/例外:
前提是逻辑没有错误,但在运行期间因为某种原因导致错误
程序意外终止,这种错误就叫做异常
一定要注意,异常是运行期间发生的
比如:
int num1,num2;这个两个值需要从键盘录入
int result=num1/num2;
如果num2录入的是非零值,程序可以正常运行,没有异常
如果num2录入的是零值,程序怒能正常运行,代码逻正确,有异常,且程序终止
有了异常,最直接的结果,就是程序终止了,这不是程序的目的
所以要处理异常,处理异常的目的有两个
- 避免程序意外终止
- 如果出现了异常,程序不能终止,还要给一个友好提示
程序意外终止:就是程序执行到某一行位置的时候,不执行了
jvm就不再继续执行这个程序了
处理的方案有两种
方案一:
用java代码提供的异常处理机制 try catch finally
方案二:
用java的逻辑代码来处理,即用java代码来容错
用java的try catch finally的一些相关的注意事项
- 一般情况下,try块中监视的代码,需要程序员猜测try块中
- 有多少种可能产生的异常,在try块中的代码可能有n种异常,那么就在try块的下面写n个catch,且catch抓取的异常类型是不同的
- 如果发生了异常但是,没有catch来抓住,程序还是意外终止的,
- 为了解决这个问题,需要添加第n+1个catch,这个catch的异常类型是Exception异常类型,即catch(Exception e),且此catch必须放在所有的catch的最后
一个try 可以有零个或一个或多个catch
一个try可以没有catch,但必须有finally
什么是finally:
finally块中放置若干java代码,一般情况下,finally块中的代码是用来释放try块中种申请的内存空间
try块中如果有异常,会抛出异常,在某一个catch块接收到系统抛出
的异常(必须保证catch抓取的异常类型,跟抛出的异常类型相同)
,然后对应catch块中的代码就被执行了,catch块一般有两类代码,
一个是栈的轨迹 (开发期间)
一个是友好的交互或提示的代码
执行完当前catch块中的代码后,会跳过后面所有的catch块,执行
finally块中的代码,执行完finally块后的代码后,继续执行finally
块后面的代码,即没有异常,最终都会执行finally块,用户销毁申请
的内存空间.
异常的继承层次:
*类:Throwable
Trowable类有两个子类
Error类:不是程序员能使用的,一般情况下是jvm使用,虚拟机级别的错误(如内存溢出…)
比如:
要往u盘中写入一个文件,但没有u盘这个设备
异常错要抛给jvm来处理Exception类:是程序员能够写代码处理的异常的根类分为两类别:
1.免检异常:不是必须添加try catch finally的
程序是能够编译和执行的,执行时触发的符合的异常程序还是意外终止
RuntimeException 运行时异常
ArithmethicException 算术异常
NullPointerException 空指针异常
ArrayIndexOutofBoundsException 数组下标越界异常
NumberFormatException 数字格式异常
InputMismatchException 输入不匹配异常
…等2.必检异常:必须添加try catch finally,如果不添加,
则会会有红波浪线提示,说明程序时不能编译和执行
Exception 所有程序员能处理的异常的根类
SQlException sql异常
ClassNotFoundException 类没有发现异常
FileNotFoundException 文件没有发现异常
…等
如何判断异常时是免检还是必检?
- 如果程序员在写代码的时候,代码没有错误,但报了红波浪线,并提示"Unhandled exception type XXXException"(无法处理 异常 类型 具体的异常类型)
只要提示这句话,那么就属于必检异常
必检异常必须添加try catch.否则红波浪线不会消失
快捷键 alt+shift+z 来调用代码块的模板
throw:
在java中,有一个Exception类,这个类有很多的子类, 每个子类都对应一种异常类型,这些异常类型都是java类库自带的的异常类型
比如:
NullPointerException
ArrayIndexOutofBoundsException
类似这些异常都java的定义完的规则,触犯规则就抛异常,即,系统定义的规则,系统检测到就由系统抛出
java中不可能把所有项目中遇到的异常都事先写好异常类
由程序员根据实际业务需求来抛出异常
比如:
要求年龄在1到100岁之间,如果不在范围内就抛出相应的异常
程序员定规则,程序员用java代码检测,程序员抛出
实现的方式有两种
方式一:
用try catch finally throw
方式二:
用java的逻辑代码来处理
throws:
throws关键字放在方法声明的后面,可以写很多个异常类型
之间用逗号间隔,表名此方法体可能会抛出的异常,这些异常
不在当前的方法体中用try catch finally处理,谁调用此方法
谁就用try catch finally来处理
注意:Exception类型必须放在throws后所有异常类型的后面
throws 的应用场景:一般情况下,写类库的时候,类库是提供给
其他项目使用的,类中的方法如果有异常,就适合用throws抛出
然后谁调用方法,谁就用try catch来处理,
自定义异常:
程序员自己创建的java类,但是必须继承自Exception及其子类中的任何类都可以,那么此类就是自定义异常类
自定义异常类,是作为本项目的异常类型补充
/**
* 自定异常类 AgeException
* @author zhangyang
*
*/
public class AgeException extends Exception {
public AgeException(){
super("年龄不对");
}
public AgeException(String message){
super(message);
}
@Override
public String getMessage() {
// TODO Auto-generated method stub
return "年龄不合法";
}
}
import org.junit.Test;
public class Demo {
/**
* throw 和 throws用法
*/
private void setAge(int age)throws AgeException{
if(age>=1 && age<=100){
this.age=age;
}else{
//非要抛必检异常
throw new AgeException("年龄范围不对");
}
}
@Test //Junit4测试框架
public void testMethod(){
try {
setAge2(10000);
} catch (Exception e) {
// TODO Auto-generated catch block
}
}
}
应用场景:
java不可能把所有的项目中出现的异常,都事先准备好,所以,程序员根据需求自定义异常类,在自定义的异常类,提供异常错误信息