异常作用:在运行java代码时,如果有错是无法编译成功的,IDE会给出一串错误说明;如果编译通过,程序运行过程中,JVM检测出一个不可执行的操作,会出现运行时错误,IDE也会给出错误说明;这就是java异常类的作用。
异常分类:java中的异常都是继承自Throwable类,它的两个子类为Error与Exception。Error类层次结构描述了java运行时系统的内部错误和资源耗尽错误。Exception有一个子类RuntimeException,它描述的是程序设计错误,需要修改逻辑 ;而程序本身没有问题,但由于像IO错误这类问题导致的异常属于其他异常。RuntimeException、Error以及它们的子类都称为免检异常;所有其它异常称为必检异常,需要程序员检查并通过try-catch块来处理。
使用异常:java的异常处理模型基于三种操作:声明异常(throws)、抛出异常(throw)、捕获异常(try-catch-finally)。
java当前执行的语句通常属于某个方法,方法不仅需要告诉编译器返回什么值,还要告诉编译器有可能发生什么错误。因此方法需要声明它可能抛出的必检异常类型,他人使用该方法时会知道捕获何种异常。通过throws关键字声明:
public void myMethod () throws IOException
一个方法必须声明所有可能抛出的受查异常。
通过条件判断,如果方法中可能出现异常,就要抛出它。比如
throw new IOException(parameter)
一旦方法抛出了异常,这个方法就不可能返回到调用者。也就是说,不必为返回的默认值或错误码担忧。
疑 问 : 后 端 修 改 数 据 库 数 据 时 , 网 络 异 常 , 导 致 修 改 失 败 , 抛 出 异 常 , 前 端 该 怎 样 处 理 呢 ? \textcolor{red}{疑问:后端修改数据库数据时,网络异常,导致修改失败,抛出异常,前端该怎样处理呢?} 疑问:后端修改数据库数据时,网络异常,导致修改失败,抛出异常,前端该怎样处理呢?
当调用方法时,如果某个异常发生的时候没有在任何地方进行捕获,那程序就会终止执行,并在控制台打印出异常信息。try-catch语句可以捕获异常,当try中的业务语句抛出的异常对应到catch中的异常类型,会被捕获,
try{
statements;
}catch(IOException ex){
ex.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}finally{
}
如果调用了一个抛出受查异常的方法,就必须对它进行处理, 或者继续传递异常到调用的地方。
当代码抛出一个异常时, 就会终止方法中剩余代码的处理,并退出这个方法的执行。如果方法获得了一些本地资源,并且只有这个方法自己知道,又如果这些资源在退出方法之前 必须被回收,那么就会产生资源回收问题。上面finally字句可以很好地解决这一问题,无论在 try 语句块中是否遇到异常,finally 子句语句都会被执行。执行顺序try–finally–catch(或者try中的return)。
try-with-resource
需要关闭资源时,使用带资源的 try 语句是一种好的选择。
try (Scanner in = new Scanne「(new FileInputStream('7usr/share/dict/words"). "UTF-8"):
PrintWriter out = new Pri ntWriter("out.txt"))
{
while (in.hasNextO)
out.pri ntl n(i n.next().toUpperCaseO);
}
不论这个块如何退出, in 和 out 都会关闭。如果你用常规方式手动编程,就需要两个嵌 套的 try/finally语句。
自定义异常
我们自定义一个异常类MyException,它的功能是输出“出现异常”来提示我们出现异常。people类中的setSex方法声明并抛出此异常。测试类中调用了setSex方法,因为该方法可能会抛出异常,所以在调用的地方我们用try-catch块来处理可能捕获的异常。
public class TestMyException {
public static void main(String[] args) {
// TODO Auto-generated method stub
People p=new People();
try {
p.setSex("Male");
} catch (MyException e) {
e.printStackTrace();//输出异常信息
}
}
}
class MyException extends Exception{
public MyException(String message) {
super("出现异常:"+message);
}
}
class People {
String name="";
int age=0;
String sex;
public String getSex()
{
return sex;
}
public void setSex(String sex) throws MyException{
if("男".equals(sex) || "女".equals(sex)) {
this.sex=sex;
} else {
throw new MyException("性别必须是男或者女");
}
}
}