异常(Exception)
概念
指的是程序在运行中,出现非正常情况
有时候我们编写完程序在运行过程中会出现一些错误,程序编译通过不代表运行时不会出错;
如:
public class ExecptionTest01 {
public static void main(String[] args) {
System.out.println(1/0);
}
}
用0做了除数,会抛出 java.lang.ArithmeticException 的异常。
你可以通过这个异常能够快速知道这个程序出现的问题,有助于开发者编写出更加健壮的程序,这是异常最主要的作用。
异常的分类
异常主要分为:Error、一般性异常、RuntimeException
对于严重的,java通过Error类进行描述。
- 对于Error一般不编写针对性的代码对其进行处理。
对与非严重的,java通过Exception类进行描述。
- 对于Exception可以使用针对性的处理方式进行处理。
Error : 指的是系统级别的异常,最典型的Error的异常是:OutOfMemoryError(内存溢出)
一般性异常:出现了这种异常必须在程序里面显示的处理,否则程序无法编译通过
RuntimeException:此种异常可以不用显示的处理,例如被0除异常,java没有要求我们一定要处理。
异常的处理
关键字:try catch finally throw throws
抛出异常throw
在指定的方法中抛出指定的异常
使用格式:throw new xxxException(“异常产生的原因”)
注意:
- 必须写在方法的内部
- new的对象必须是Exception或者Exception的子类对象
- 抛出指定的异常,必须要处理
- 如果后面是RuntimeException或者其子类,可以交给JVM处理
- 如果后面是编译异常,我们必须处理,要么throws,要么try catch
try/catch 处理异常
格式
try{
需要被检测的代码;
}catch(异常类 变量){
处理异常的代码(处理方式);
}
finally{
一定执行的语句;
}
Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。
可以使用catch捕捉多个异常,但是catch里面必须从小类型异常到大类型异常进行捕捉,最多执行一个catch语句块里面的内容。
finally关键字
通常跟在最后catch后面,异常如果没有被捕获,会执行finally的代码
throws关键字
在功能上通过throws的关键字声明了该功能有可能会出现问题
自定义异常
因为项目中会出现特有的问题,
而这些问题并未被java所描述并封装对象。
所以对于这些特有的问题可以按照java的对问题封装的思想。
将特有的问题。进行自定义的异常封装。
定义一个IllegalNameExecption异常
package com.kroy;
public class IllegalNameExecption extends Exception {
public IllegalNameExecption(){
super();
}
public IllegalNameExecption(String msg){
super(msg);
}
}
UserService使用throws抛出给调用者
package com.kopi;
public class UserService {
public void register(String username) throws IllegalNameExecption{
if(username.length()<6){
throw new IllegalNameExecption("用户名小于6位");
}
System.out.println("注册成功");
}
}
package com.kopi;
public class RegistTest {
public static void main(String[] args){
UserService us = new UserService();
try {
us.register("Ky");
} catch (IllegalNameExecption e) {
e.printStackTrace();
}
}
}
注意:
- 声明异常时,声明更具体的的异常,处理的可以 更具体
- catch 不能独立于 try 存在。
- 在 try/catch 后面添加 finally 块并非强制性要求的。
- try 代码后不能既没 catch 块也没 finally 块。
- try, catch, finally 块之间不能添加任何代码。
throw和throws的区别
- throws
- 用在方法声明后面,跟的是异常类名
- 可以跟多个异常类名,用逗号隔开
- 表示抛出异常,由该方法的调用者来处理
- throw
- 用在方法体内,跟的是异常对象名
- 只能抛出一个异常对象名
- 表示抛出异常,由方法体内的语句处理