异常

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

由图可知,异常的根类是throwable.其下有两个子类

Error:严重错误Error,无法通过处理的错误,只能事先避免。

Exception:由于使用不当导致,是可以避免的,异常产生后程序员可以通过代码的方式去纠正,使程序继续运行。

而我们平常所说的异常就是指Exception,而它分为;也分为两类:

• 编译时期异常:在编译时期就会检查,如果没有处理异常,则编译失败。(如日期格式化类异常)

运行时期异常:在运行期间,去检查异常,在编译时期,运行异常不会编译器检测(不报错,如数学异常)

(一)异常产生过程的解析

下面的代码是一个简单的数组索引越界案例(运行时期异常,编译器不会提示错误)

public static int getElement(int []arr,int index){
int ele = arr[index];
return ele;
}

已知传来的数组使{1,2,3},索引是3,这是时候JVM就会检测程序出现异常

JVM会做两件事:

1.JVM会根据异常产生的原因创建一个异常的对象,这个异常的对象包含了异常产生的(内容,原因,位置)。

会 new ArrayIndexOutBoundsException("3");

2.在getElement方法中没有异常处理逻辑(try..catch),那么JVM就会把异常对象抛出给方法的调用者mian方法去处理这个异常。

public static void main(String[] args) {
int [] arr ={,,};
getElement(arr,)
}

main方法接收到这个异常对象 new ArrayIndexOutBoundsException("3"),main 方法也没有异常的处理逻辑,就会继续把对象抛出给main方法的调用者JVM来处理。

JVM接受到这个异常对象,会做两件事:

1.把异常对象(内容,原因,位置)以红色的字体打印在控制台。

2.JVM会终止正在执行的Java程序---中断处理。

(二)异常的处理

Java异常处理的五个关键字:try,catch,finally,throw,throws

throw关键字:可以使用throw关键字在指定的方法中抛出特定的异常。throw new xxxException("异常产生的原因");

注意:1.throw关键字必须写在方法的内部。

2.throw关键字抛出指定的异常对象,我们必须去处理这个异常对象。(如果是运行时期的异常,则默认交给JVM去处理,如果是编译期异常,我们要么继续throws往上抛异常,要么try..catch自行处理异常)。

throws关键字:当方法内部抛出异常对象时,那么我们必须去处理这个异常对象。throws关键字会把异常对象声明抛出给方法的调用者去处理。在方法声明时使用。

注意:1.throws关键字必须在方法声明时去使用

2.方法内部如果抛出了多个异常对象,那么throws后面也必须声明多个异常。

3.调用了一个声明抛出异常的方法,那么我们必须去处理声明的异常。

try..catch关键字 :try{  可能产生异常的代码

}catch(定义一个异常的变量,用来接收try中抛出来的异常对象){异常的处理逻辑,怎么处理异常对象,一般在工作中会把异常的信息记录在一个日志当中}

注意:1.try中可能会抛出多个异常,那么可以用多个catch去接受这些异常对象。

2.处理完try..catch程序会继续执行之后代码。

Throwable中定义了一些查看异常信息的方法:

public Stirng getMessage():获取简单的错误原因。

public String toString():获取异常的类型及原因 相当于对象本身。

public void  printStackTrace():打印异常的跟踪栈信息并输出到控制台。

try..catch..fianlly{无论是否出现异常都会执行,一般用来释放资源。}

import java.io.FileNotFoundException;
import java.io.IOException; public class DemoException {
public static void main(String[] args) {
try {
readFile("C:\\a.tx");
} catch (IOException e) {
//System.out.println(e.getMessage());//异常信息简短
//System.out.println(e.toString());//等于e,重写Object.toString方法
e.printStackTrace();
}
System.out.println("你好"); } public static void readFile(String file) throws IOException{
if (!file.equals("C:\\a.txt")){
throw new FileNotFoundException("传递的文件路径不是C:\\a.txt");
} }
}

如上述代码,仔细观察,有一个重点我们需要知道!!!

在以后工作中,我们必须对方法传递过来的参数进行合法性校验,如果参数不合法,那么我们必须用抛出异常的方式,去告知方法的调用者,传递的参数有问题。

如果参数传的是数组,假设数组为空,那么我们就抛出空指针异常,告知方法的调用者“传递的数组是空”。

在这里介绍一个使用的方法,即Object非空判断

•public static <T> T requireNonNull(T obj):查看指定的对象不是null

直接在定义的方法中去调用Object.requireNonNull(T obj),来完成非空判断,并抛出异常。

特别注意的是方法的子父类异常之间的关系,总结为一句话是:父类什么样,子类什么样。

(三)自定义异常类

为什么会有自定义异常类呢?因为Java提供的异常类不够我们使用,需要自己定义一些异常类来使用。

格式:

public class xxxException extends Exception | RuntimeException{

1.添加一个空参构造方法,并且内部使用super()方法调用父类的无参构造方法。

2.添加一个带异常信息的构造方法,并调用内部使用super()方法调用父类的有参构造方法,并传递异常参数。

}

下面是一个一个案例,模拟注册过过程,如果用户名已存在,则抛出异常并提示:亲,该用户名已被注册。

分析:

1.使用数组保存已经注册过的用户名(数据库)。

2.使用Scanner获取用户输入的注册的用户名(前端/页面)。

3.定义一个方法,对用户输入的中注册的用户名进行判断

遍历已经注册过的用户名的数组,获取每一个用户名

使用获取到的用户名和用户输入的输入的用户名进行比较

true:用户名已经存在,抛出RegisterException异常。该用户名已经被注册

false:继续遍历比较。

循环结束给用户一个提示:恭喜你注册成功。

代码如下:

自定义异常类:

public class RegisterException extends Exception {
RegisterException(){
super();
} RegisterException(String message){
super(message);
}
}

注册用户代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner; public class Register {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"张三","李四","王五");
Scanner sc = new Scanner(System.in);
System.out.println("欢迎注册,请输入用户名:");
String user = sc.next();
try {
checkUser(user,list);
} catch (RegisterException e) {
System.out.println(e.getMessage());
} }
public static void checkUser(String user,ArrayList<String> list) throws RegisterException{
for (String name:list){
while(user.equals(name)){
throw new RegisterException("亲,用户名已经存在");//自定义异常类继承Exception异常类属于编译期异常
}
}
list.add(user);
System.out.println("亲,注册成功");
System.out.println("已经注册的用户:"+list);
}
}

那么Java异常就学习到这了~~~

Java的异常处理机制的更多相关文章

  1. 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)

    在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...

  2. Java -- 异常的捕获及处理 -- Java的异常处理机制

    7.1.4 Java的异常处理机制 在整个Java的异常处理中,实际上也是按照面向对象的方式进行处理,处理的步骤如下: ⑴ : 一旦产生异常,则首先会产生一个异常类的实例化对象. ⑵ : 在try语句 ...

  3. Java之异常处理机制

    来源:深入理解java异常处理机制 2.Java异常    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 ...

  4. java的异常处理机制(try…catch…finally)

    1 引子try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单.听话.不信 ...

  5. 深入理解java的异常处理机制

     JAVA异常的概念    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的 ...

  6. Java 的异常处理机制

    异常是日常开发中大家都「敬而远之」的一个东西,但实际上几乎每种高级程序设计语言都有自己的异常处理机制,因为无论你是多么厉害的程序员,都不可避免的出错,换句话说:你再牛逼,你也有写出 Bug 的时候. ...

  7. java——关于异常处理机制的简单原理和应用

    异常处理机制的简单原理和应用 一.Execption可以分为java标准定义的异常和程序员自定义异常2种 (1)一种是当程序违反了java语规则的时候,JAVA虚拟机就会将发生的错误表示为一个异常.这 ...

  8. Java基础-异常处理机制 及异常处理的五个关键字:try/catch/finally/throw /throws

    笔记: /** 异常处理机制: 抓抛模型 * 1."抛", 一旦抛出,程序终止! printStackTrace()显示异常路径! * 2."抓", 抓住异常 ...

  9. 十二、Java基础---------异常处理机制

    异常 异常 异常就是程序在运行时产生的异常情况. 异常的由来 问题也是现实生活中的具体事物,也可以通过java 类的形式进行描述,并封装成对象.异常就是java 对不正常情况进行描述后的对象的体现. ...

  10. java中异常处理机制的简单原理

    以上是自认为的java异常处理的简单原理,如有不妥之处还请各位大神帮忙指点,谢谢!

随机推荐

  1. 关于爬虫的日常复习(5)—— beautifulsoup库

  2. arch_遇到的问题

    archlinux安装 wiki安装 可以参考这个来安装 $如果你跟我一样是用校园网安装的$ 记得使用pppoe-setup 来联网 arclinux 图形界面安装 参考 kde图形安装 需要创建一个 ...

  3. SpringDataRedis入门到实战

    1.项目常见问题思考 对于电商系统的广告后台管理和广告前台展示,首页每天有大量的人访问,对数据库造成很大的访问压力,甚至是瘫痪.那如何解决呢?我们通常的做法有两种:一种是数据缓存.一种是网页静态化.我 ...

  4. linux容器技术之chroot

    linux容器技术之chroot linux chroot 机制的由来 root 用户启动一个daemon,必须用root 用户来启动,比如一个web 服务器(nginx/apapce 80端口)是在 ...

  5. ArrayAccess 接口(源码)

    The ArrayAccess interface (PHP 5 >= 5.0.0, PHP 7) Introduction Interface to provide accessing obj ...

  6. Oracle监听器

    Oracle 监听器 Listener 是一个重要的数据库服务器组件,在整个 Oracle 体系结构中,扮演着重要的作用.它负责管理 Oracle 数据库和客户端之间的通讯,它在一个特定的网卡端口(默 ...

  7. Docker快速上手之部署SpringBoot项目

    Docker是基于Go语言实现的云开源项目. Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装.分发.部署.运行等生命周期 ...

  8. Nodejs实战系列:数据加密与crypto模块

    博客地址:<NodeJS模块研究 - crypto> Github :https://github.com/dongyuanxin/blog nodejs 中的 crypto 模块提供了各 ...

  9. webpack入门系列1

    一.什么是webpack?为什么要使用它? Webpack 是一个前端资源加载/打包工具.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. 为什么我们要使用它呢?因 ...

  10. (5千字)由浅入深讲解动态规划(JS版)-钢条切割,最大公共子序列,最短编辑距离

    斐波拉契数列 首先我们来看看斐波拉契数列,这是一个大家都很熟悉的数列: // f = [1, 1, 2, 3, 5, 8] f(1) = 1; f(2) = 1; f(n) = f(n-1) + f( ...