java的异常解析_JAVA异常详解

一、异常的概述

异常:

指的是在程序的运行过程中,出现的非正常情况,最终会导致JVM的非正常停止。

在JAVA等面向对象的编程语言中,异常本身就是一个类,产生异常就是创建异常对象并抛出了一个异常对象。JAVA处理异常的方式是中断处理。

备注:异常指的并不是语法错误,语法错了,编译无法通过的,不会产生字节码文件,根本不会运行。

二、异常实现及分类

先看下异常类的结构图

2511ee8e623a55be53810cc5e891b152.png

上图可以简单展示一下异常类实现结构图,当然上图不是所有的异常,用户自己也可以自定义异常实现。上图已经足够帮我们解释和理解异常实现了:

1.所有的异常都是从Throwable继承而来的,是所有异常的共同祖先。

2.Throwable有两个子类,Error和Exception。

其中Error是错误,对于所有的编译时期的错误以及系统错误都是通过Error抛出的。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。

3.Exception

是另外一个非常重要的异常子类。它规定的异常是程序本身可以处理的异常。异常和错误的区别是,异常是可以被处理的,而错误是没法处理的。

4.Checked Exception

可检查的异常,这是编码时非常常用的,所有checked exception都是需要在代码中处理的。它们的发生是可以预测的,正常的一种情况,可以合理的处理。比如IOException,或者一些自定义的异常。除了RuntimeException及其子类以外,都是checked exception。

5.Unchecked Exception

RuntimeException及其子类都是unchecked exception。比如NPE空指针异常,除数为0的算数异常ArithmeticException等等,这种异常是运行时发生,无法预先捕捉处理的。Error也是unchecked exception,也是无法预先处理的。

三、异常的处理

代码中的异常处理其实是对可检查异常的处理。

1. 通过try...catch语句块来处理:

e.g.

try

{

// 程序代码

}catch(ExceptionName e1)

{

//Catch 块

}

Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。

如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。

2. 另外,也可以在具体位置不处理,直接抛出,通过throws/throw到上层再进行处理,具体的,如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。

下面方法的声明抛出一个 RemoteException 异常:

import java.io.*;

public class className

{

public void deposit(double amount) throws RemoteException

{

// Method implementation

throw new RemoteException();

}

//Remainder of class definition

}

3. finally关键字

finally 关键字用来创建在 try 代码块后面执行的代码块。

无论是否发生异常,finally 代码块中的代码总会被执行。

在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。

finally 代码块出现在 catch 代码块最后,语法如下:

try{

// 程序代码

}catch(异常类型1 异常的变量名1){

// 程序代码

}catch(异常类型2 异常的变量名2){

// 程序代码

}finally{

// 程序代码

}

四、自定义异常

什么是自定义异常类?

在开发中根据自己的业务的异常情况来定义的异常类。

异常类如何定义?

1.自定义一个编译器异常,自定义类继承与java.lang.Excption

2.自定义一个运行期异常类,自定义类继承于java.lang.RuntimeException

例子:

模拟注册操作:如果用户存在,则抛出异常并提示:亲,您的名字已经被注册了,再换个名字把!

//首先定义一个注册异常类 RegisterException ---->业务逻辑异常

public class RegisterException extends RuntimeException{

//空参构造

public RuntimeException(){}

//有参构造

public RegisterException(String message){

super(message);

}

}

public class Demo{

//使用数组模拟数据库 已存在多个账户名称

public static String[] names = {"小孙","小王","小赵"};

public static void main(String[] args){

//Scanner

Scanner sc = new Scanner(System.in);

String name = sc.next();

//校验账户是否已被注册过

try{

//可能会引发异常的代码

checkName(name);//如果没有发生异常,就代表注册成功

System.out.plintln("注册成功");

}catch(RegisterException e){

//异常的处理逻辑

e.printstackTrace();

}

}

//先校验账户是否已被注册

public static boolean checkName(String username)throws RegisterException{

for(String name : names){

if(name.equals(username)){

//表明 名字已经注册过了,就抛出注册异常

throw new RegisterException("亲,您的名字已经被注册了,再换个名字把!");

}

}

return true;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值