一,异常(Exception)不正常
前提:在程序执行过程中,总是会出现错误,有的错误是在编码时就会出现,有的错误是在运行时出现。
这些错误都是我们程序员关注的。但是要不要处理时另外一回事。对于有些错误会导致程序不能正常执行甚至crash(崩溃)。
在JKD中,所谓的错误称之为异常,Exception,以类的方式存在。
二,异常的作用
异常的处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰
三,异常类的继承结构
Throwable
-Excpetion
-Error
2.1Error
系统级别的错误,无法通过捕获来解决。一般情况下,Error不需要程序关心,程序员也无法改变。
2.2Exception
程序级别的错误。相对Error而言,没有那么严重,而且能够处理;
比如:NullPointerException 空指针异常
异常如果需要及时处理,否则可能会引起程序的崩溃。
四,Exception有两个主要的子类:
IOException
RubtimeExcetion
异常分为两种:
受检异常/编译时异常
在编译时就会报错,必须处理。编码错误在IDEA等开发工具中可以直观的看到
非受检异常/运行时异常
在编译时没有错,不是必须处理的。但是不处理的话在循行时会报错。代码逻辑错误导致的
五,异常的处理
throw和throws:抛出,投掷
只是抛出异常,不进行处理
现实世界中,员工解决不了的问题,直接抛给领导。
throw: 用于方法实现(在语句块中),抛出指定异常。(如登陆异常:throw new MyException("账号不存在");)
throws:用于方法声明(在方法名后面),说明该放方法会抛出某些异常。
此时程序员不需要处理,而是把可能发生的异常传递到了该方法的调用者。
注意:在实际开发过程中,对于非受检异常(RuntimeException),只有在运行时才会出现异常,所以可不用throws提前抛出。
但是对于受检异常,需要处理,如果不解决,则可以直接使用throws。
意思就是受检异常,在eclipse写代码时就会报错,需要处理,如果不处理,就不能运行
非受检异常是在运行后出现的,可以先不进行处理
这里buyFood方法是main方法调用的,buyFood只是throws,并没有解决,那么解决IOException交给main去解决。So:
1 main方法处理
2 main方法不处理,继续抛出,抛给JVM.
try-catch和try-catch-finally 处理异常
作用:将可能发生的异常的信息包裹起来,如果执行异常,就输出异常信息给用户
是真正的处理异常
try{
有可能抛出异常的代码 //如果没有异常就执行这里面的代码
} catch(异常){
捕获并处理try中产生的异常,比如一般输出异常的信息
//如果出现异常,就执行其中代码。一般添加输出语句为System.out.print(e) e:异常的说明信息
默认e.xxxx就会打印异常信息 作用:输出异常信息给用户
}
try{
有可能抛出异常的代码
} catch(异常){
处理异常,比如一般输出异常的信息
}finally{
一些收尾的工作,比如内存释放,DB连接回收,IO的操作的关闭等。无论是否发生异常,finally 代码块中的代码总会被执行。
}
总结:程序的执行总有可能碰到异常,处理异常的放式要么throw,要么try-catch.
自定义异常
编写自定义异常的步骤:
1根据编写的异常类型去继承RunTimeException/Exception
2重写参数为String的方法
在自定义编译时异常继承
5.1 自定义编译时异常继承Exception: extends Exception,指的是受检异常。
public class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
5.2 自定义运行时异常继承RunTimeException: extends RunTimeException,指的是非受检异常。
public class MyException extends RunTimeException{
public MyException(String message){
super(message);
}
}