异常

异常概念

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

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

异常体系

异常机制其实是帮助我们找到程序中的问题,异常的根类是java.lang.Throwable,其下有两个子类:
java.lang.Errorjava.lang.Exception,平常所说的异常指java.lang.Exception

java.lang.Throwable:类是Java语言中所有错误或异常的超类。

Exception:编译期异常,进行编译(代码)Java程序出现的问题

  • RuntimeException:运行期异常,Java程序运行过程中出现的问题
  • 异常就相当于程序得了一个小毛病(感冒 发烧),把异常处理掉可以继续执行(吃药)

Error:错误

  • 错误就相当于程序得了一个无法治愈的毛病,必须修改源代码,程序才能继续执行

异常的产生过程的解析

int[] arr = {1,2,3};
int e = getElement(arr,3);

1)访问数组中的3索引,而数组是没有3索引的,这时候,JVM就会检测程序出现异常
JVM会做两件事:

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

new ArrayIndexOutOfBoundsException("3");

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

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

3)JVM接收到了这个异常对象,做了两件事情
new ArrayIndexOutOfBoundsException("3");

  • 1.把异常对象(内容,原因,位置)以红色的字体打印在控制台
  • 2.JVM会终止当前在执行的Java程序-->终端处理

异常的处理

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

throw关键字
作用:

  • 可以使用throw关键字在指定的方法中抛出指定的异常

使用格式:

throw new xxxException("异常产生的原因");

注意:

  1. throw关键字必须写在方法的内部
  2. throw关键字后边new的对象必须是Exception或者Exception的子类对象
  3. throw关键字抛出指定的异常对象,我们就必须处理这个异常对象
  • throw关键字后边创建的是RuntimeException或者是RuntimeException的子类对象,我们可以不处理,默认交给JVM处理(打印异常对象,中断程序)
  • throw关键字后边创建的是编译异常(写代码的时候报错),我们就必须处理这个异常,要么throws,要么try...catch

Objects类中的静态方法
public static <T> T reguireNonNull(T obj):查看指定引用对象不是null。
源码:

    public static <T> T reguireNonNull(T obj){
if (obj == null)
throw new NullPointerException();
return obj;
}

throws声明异常
throws关键字:异常处理的第一种方式,交给别人处理
作用:

  • 当方法内部抛出异常对象的时候,那么我们就必须处理这个异常对象
  • 可以使用throws关键字处理异常对象,会把异常对象声明抛出给方法的调用者处理(自己不处理,给别人处理),最终交给JVM处理-->中断处理

使用格式:在方法声明时使用

    修饰符 返回值类型 方法名(参数列表) throws AAAException ,BBBException...{
throw new AAAException("产生原因");
throw new BBBException("产生原因");
}

注意:

  1. throws关键字必须写在方法声明处
  2. throws关键字后边声明的异常必须是Exception或者是Exception的子类
  3. 方法内部如果抛出了多个异常对象,那么throws后边必须也声明多个异常
  4. 如果抛出的多个异常对象有父子类关系,那么直接声明父类异常即可
  5. 调用了一个声明抛出异常的方法,我们就必须处理这个异常对象
  • 要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM
  • 要么try...catch自己处理异常

捕获异常try...catch

try...catch:异常处理的第二种方式,自己处理异常

格式:

    try{
可能产生异常的代码
}catch(定义一个异常的变量,用来接收try中抛出的异常对象){
异常的处理逻辑,在异常对象之后,怎么处理异常对象
一般在工作中,会把异常的信息记录到一个日志中
}
...
catch(异常类名 变量名){ }

注意:

  1. try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象
  2. 如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try...catch之后的代码

如果try中没有产生异常,那么就不会执行catch中异常的处理逻辑,执行完try中的代码,继续执行try...catch之后的代码

Throwable类中定义了3个异常处理的方法

  1. String getMessage() 返回 Throwable 的简短描述
  2. String toString() 返回 Throwable 的详细消息字符串
  3. void printStackTrace() JVM打印异常对象,默认此方法,打印的异常信息是最全面的

finally代码块
格式:

    try{
可能产生异常的代码
}catch(定义一个异常的变量,用来接收try中抛出的异常对象){
异常的处理逻辑,在异常对象之后,怎么处理异常对象
一般在工作中,会把异常的信息记录到一个日志中
}
...
catch(异常类名 变量名){ }finally{
无论是否出现异常都会执行
}

注意:

  1. finally不能单独使用,必须和try一起使用
  2. finally一般用于资源释放(资源回收),无论程序是否出现异常,最后都需要资源释放(IO)
  3. 如果finally有return语句,永远返回finally中的结果,避免该情况。

注意:

  • 父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出。
  • 父类异常时什么样,子类异常就什么样

自定义异常类:

  • Java提供的异常类,不够我们使用,需要自己定义一些异常类

格式:

public class XXXException extends Exception | RuntimeException{
添加一个空参数的构造方法
添加一个带异常的构造方法
}

例子:
要求:模拟注册操作,如果用户已经存在,则抛出异常并提示:亲,该用户已经被注册。

分析:

  1. 使用数组保存已经注册过的用户名(数据库)
  2. 使用Scanner获取用户输入的注册的用户名(前端,页面)
  3. 定义一个方法,对用户输入的注册的用户名进行判断
  • 遍历存储注册过的用户名的数据,获取每一个用户名
  • 使用获取到的用户名和用户输入的用户名比较

true:

  • 用户已经存在,抛出RegisterException异常,告知用户”亲,该用户已经被注册。“

false:

  • 继续遍历比较
  • 如果循环结束了,还没有找到重复的用户名,提示用户"恭喜您,注册成功!"
public class CaiNiao{
//1.使用数组保存已经注册过的用户名(数据库)
static String[] usernames = {"菜鸟","小菜","老鸟"}; public static void main (String[] ages) throws RegisterException{
//2. 使用Scanner获取用户输入的注册的用户名(前端,页面)
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要注册的用户名;")
String username = sc.next();
checkUsername(username);
}
//3. 定义一个方法,对用户输入的注册的用户名进行判断
public static void checkUsername(String username) throws RegisterException{
//遍历存储注册过的用户名的数据,获取每一个用户名
for (String name:usernames){
//使用获取到的用户名和用户输入的用户名比较
if(name.equals(username)){
//true:用户已经存在,抛出RegisterException异常,告知用户”亲,该用户已经被注册。“
throw new RegisterException("亲,该用户已经被注册。");
}
}
//如果循环结束了,还没有找到重复的用户名,提示用户"恭喜您,注册成功!"
System.out.println("恭喜您,注册成功!");
}
}

Java学习:异常的概念的更多相关文章

  1. java学习--异常

    异常的概念 java异常是java提供的用于处理程序中错误的一种机制 所谓的错误是指在程序运行过程中发生的一些异常事件.如除0溢出,数组下标越界,文件不存在 设计良好的程序应该在异常发生时,提供处理这 ...

  2. JAVA记录-异常基本概念

    1.异常分类 2.错误和异常的区别 3.try-catch-xxx处理方式 Java Exception:1.Error 2.Runtime Exception 运行时异常3.Exception 4. ...

  3. Java学习之接口概念

    Java语言只支持单重继承,不支持多继承,即一个类只能有一个父类.但是在实际应用中,又经常需要使用多继承来解决问题.为了解决该问题,Java语言提供接口来实现类的多继承问题. 接口(英文interfa ...

  4. Java修炼——异常的概念以及处理方式(捕获异常)

    异常概念分类 异常( Exception 也称例外)就是在程序的运行过程中 所发生的不正常的事件,它会中断正在运行的程序  所需文件找不到  网络连接不通或中断  算术运算错 (被零除-)  ...

  5. java学习之面向对象概念

    思考的两种方式: 举例: 把大象放到冰箱里 一.面向过程 :[打开冰箱->把大象放里面->关上冰箱门]面向过程注重的是过程,也就是(动作[函数]),然后按照动作依次去执行就好了. 代表语言 ...

  6. Java学习之基本概念

    1.java体系结构: j2se:是Java的标准版,用于标准的应用开. j2ee:是Java的企业版,用于企业级的应用服务,web服务开发. j2me:是Java的微型版,用户手机或嵌入式开发. p ...

  7. Java学习-异常2

    1.异常处理的第一种方式是:上抛[throws] 2.异常处理的第二种方式是:try....catch..如果不想让调用程序知道该异常发生了,被调用的程序应该使用try...catch..进行异常捕捉 ...

  8. java学习路线图-----java基础学习路线图(J2SE学习路线图)

    安装JDK和开发软件跳过,网上太多了,不做总结,以下是我总结的学习路线图,欢迎补充. JAVA基础语法 注释,标识符命名规则及Java中的关键字 Java基本数据类型 Java运算符与表达式 Java ...

  9. java学习一目了然——异常必知

    java学习一目了然--异常必知 我们只要学java,异常肯定非常熟悉,该抛的时候抛一下就行.但是这其中还有点小细节需要注意.就用这个小短篇来说一下异常处理中的小细节吧. 异常处理 RuntimeEx ...

随机推荐

  1. 一个标准sql语句模板

    select distinct top n * from t1 inner join t2 on ... join t3 on ... where ... group by ... having .. ...

  2. Python Django 实现简单注册功能

    Python Django 实现简单注册功能 项目创建略,可参考前期文档介绍. 目录结构如下 编辑views.py from django.shortcuts import render # Crea ...

  3. 简单mvc---模拟Springmvc

    1.注解篇 Auwowrited package org.aaron.mvc.annaotation; import java.lang.annotation.Documented; import j ...

  4. Linux服务之DNS介绍

    DNS-------Domain Name System域名系统 介绍:DNS就是把域名和IP地址联系在一起的服务,有了DNS服务器,你就不用输入IP地址来访问一个网站,可以通过输入网址访问.     ...

  5. istio部署-快速入门

    参考 istio/istio Quick Start Evaluation Install fleeto/sleep fleeto/flaskapp 本文为 istio 快速入门部署,一般用于演示环境 ...

  6. React源码 ReactDOM.render

    在 react 当中,主要创建更新的有三种方式 1.ReactDOM.render || hydrate  这两个api都是要把这个应用第一次渲染到我们页面上面,展现出来整个应用的样子的过程,这就是初 ...

  7. HDU1754 && HDU1166 线段树模板题

    HDU1754 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 题目分析:对于给出的一个很长的区间,对其进行单点更新值和区间求最大值的操作,由于 ...

  8. Leetcode周赛165

    目录 找出井字棋的获胜者 思路 代码 不浪费原料的汉堡制作方案 思路 代码 统计全为 1 的正方形子矩阵 思路 代码 分割回文串 III 思路 代码 找出井字棋的获胜者 思路 模拟. 代码 class ...

  9. django rest framework 序列化组件总结

    序列化组件总结 一. 序列化组件本质上为了实现前后端分离,而进行json序列化的一个组件形式,极大方便了解析数据的作用 二. 所有序列化是基于APIView 解析器实现的,通过内部的多继承关系方便实现 ...

  10. python 验证码识别示例(五) 简单验证码识别

    今天介绍一个简单验证的识别. 主要是标准的格式,没有扭曲和变现.就用 pytesseract 去识别一下. 验证码地址:http://wscx.gjxfj.gov.cn/zfp/webroot/xfs ...