一、什么是异常:

异常就是在运行时产生的问题。通常用Exception描述。

在java中,把异常封装成了一个类,当出现问题时,就会创建异常类对象并抛出异常相关的信息(如详细信息,名称以及异常所处的位置)。

二、异常的继承关系:

Throwable类是所有错误跟异常类的超类(祖宗类)。

Exception异常类及其子类都是继承自Throwable类,用来表示java中可能出现的异常,并且合理的处理这些异常。

RuntimeException类是运行异常类,继承自Exception类,它以及它的子类只能在运行过程中存在,当出现时,只能修改源代码,此异常无法处理。

Error类是与Exception的平级的类,用来表示Java中存在的严重错误,只能通过修改代码来解决问题。

继承体系的总结:

    Throwable: 它是所有错误与异常的超类(祖宗类)
|- Error 错误
|- Exception 编译期异常,进行编译JAVA程序时出现的问题
|- RuntimeException 运行期异常, JAVA程序运行过程中出现的问题

三、异常与错误的区别:

异常是指程序在编译或者运行时出现的某种异常问题,我们可以对异常进行某种处理,如果不处理异常的话,程序将会停止运行。

错误是指程序在运行时出现的严重问题,无法处理,程序将会停止运行,Error通常都是系统级别的问题,都是虚拟机jvm所在系统发生的,只能通过修改源代码解决问题。

四、异常产生的过程:

1.运行或编译时产生异常

2.创建异常类的对象

3.声明异常类

4.将异常类对象传给调用者(main()方法)处理

5.调用者无法处理,再将异常类对象传给jvm虚拟机

6.jvm虚拟机将异常类的信息(名称、详细信息、异常所处的位置)打印在屏幕上,并且停止程序的运行

 五、抛出异常throw

在java中,提供了一个throw关键字,用来抛出一个指定的异常。

使用方法:

1.创建一个异常对象。封装一些提示信息

2.将这个异常告知调用者

使用格式:

throw new 异常类名(参数);

 六、声明异常throws

声明异常格式:

修饰符 返回值类型 方法名称 (参数)throws 异常1名称,异常2名称{

}

七、捕获异常try...catch...finally

捕获异常:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理

语句格式:

try {

     //需要被检测的语句。

}

catch(异常类 变量) { //参数。

     //异常的处理语句。

}

finally {

     //一定会被执行的语句。

}

try该代码块中编写可能产生异常的代码。

catch用来进行某种异常的捕获,实现对捕获到的异常进行处理。

finally有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。

捕获异常的组合方式:

1.  try catch finally组合:检测异常,并传递给catch处理,并在finally中进行资源释放。

 2.  try catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。对异常进行捕获处理。

 3.  一个try 多个catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。对每种异常信息进行不同的捕获处理。

注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。

4. try finally 组合: 对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出。异常是没有捕获处理的。但是功能所开启资源需要进行关闭,所有finally。只为关闭资源。

八、运行时期异常 RuntimeExecption

特点:

   方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常

    运行时期异常一旦发生,需要程序人员修改源代码

九、异常在方法重写中细节

1. 子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明。

class Fu {
public void method () throws RuntimeException {
}
}
class Zi extends Fu {
public void method() throws RuntimeException { } //抛出父类一样的异常
//public void method() throws NullPointerException{ } //抛出父类子异常
}

2.当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集

class Fu {
public void method () throws NullPointerException, ClassCastException{
}
}
class Zi extends Fu {
public void method()throws NullPointerException, ClassCastException { }
public void method() throws NullPointerException{ } //抛出父类异常中的一部分
public void method() throws ClassCastException { } //抛出父类异常中的一部分
}

3.当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常的。

class Fu {
public void method (){
}
}
class Zi extends Fu {
public void method() throws Exception { }//错误的方式
}

十、异常中常用方法

在Throwable类中为我们提供了很多操作异常对象的方法,常用的如下:

1.getMessage方法:返回该异常的详细信息字符串,即异常提示信息

2. toString方法:返回该异常的名称与详细信息字符串

3. printStackTrace:在控制台输出该异常的名称与详细信息字符串、异常出现的代码位置

十一、自定义类异常

格式:

Class 异常名 extends Exception{ //或继承RuntimeException
public 异常名(){
}
public 异常名(String s){
super(s);
}
}

自定义异常继承Exception演示:

class MyException extends Exception{
/*
为什么要定义构造函数,因为看到Java中的异常描述类中有提供对异常对象的初始化方法。
*/
public MyException(){
super();
}
public MyException(String message) {
super(message);// 如果自定义异常需要异常信息,可以通过调用父类的带有字符串参数的构造函数即可。
}
}

自定义异常继承RuntimeException演示:

class MyException extends RuntimeException{
/*
为什么要定义构造函数,因为看到Java中的异常描述类中有提供对异常对象的初始化方法。
*/
MyException(){
super();
}
MyException(String message) {
super(message);// 如果自定义异常需要异常信息,可以通过调用父类的带有字符串参数的构造函数即可。
}
}

实例代码:

throw,throws,try/catch的使用

package com.oracle.Demo01;

public class Demo01 {
//try/catch格式: 用来处理异常
// try{
// 被检测的代码(可能出现异常的代码)
// }catch(异常类名 变量){
// 异常的处理方式
// }finally{
// 必须要执行的代码
// }
public static void main(String[] args) {
int[] arr={1,2,3};
try{
int res=getArray(arr);
System.out.println(res);
}catch(ArrayIndexOutOfBoundsException ex1){ //多catch处理时,平级的没有先后顺序
System.out.println(ex1); //当出现父子类关系式,一定要将子类的放在前面
System.out.println("===========");
System.out.println(ex1.getMessage());
System.out.println("===========");
System.out.println(ex1.toString()); }catch(NullPointerException ex2){
System.out.println(ex2);
System.out.println(ex2.getMessage());
System.out.println("===========");
ex2.toString();
}finally{
System.out.println("必须要执行的代码");
} System.out.println("我执行了吗");
}
//throw跟throws的区别 用来报告异常
//throw 关键字后面,必须跟异常对象
// throws 关键字后面,必须跟异常类名 用来将异常传给调用者
public static int getArray(int[] arr) throws ArrayIndexOutOfBoundsException,NullPointerException{
if(arr==null){
throw new NullPointerException("数组为空o(╯□╰)o");
}
if(arr.length<4){
throw new ArrayIndexOutOfBoundsException("数组长度不够(キ`゚Д゚´)!!");
}
int i=arr[3]*2;
System.out.println("aaa");
return i;
} }

Java学习(异常类)的更多相关文章

  1. Java学习-023-Properties 类 XML 配置文件读取及写入源代码

    之前的几篇 Properties 文章已经讲述过了 Java 配置文件类 Properties 的基本用法,查看 JDK 的帮助文档时,也可看到在 Properties 类中还有两个方法 loadFr ...

  2. Java学习——BigInteger类和BigDecimal类

    Java学习——BigInteger类和BigDecimal类 摘要:本文主要学习了用于大数字运算的BigInteger类和BigDecimal类. 部分内容来自以下博客: https://www.c ...

  3. Java学习——枚举类

    Java学习——枚举类 摘要:本文主要介绍了Java的枚举类. 部分内容来自以下博客: https://www.cnblogs.com/sister/p/4700702.html https://bl ...

  4. Java学习——日期类

    Java学习——日期类 摘要:本文主要记录了Java开发中用到的和日期有关的类以及对日期的操作. 部分内容来自以下博客: https://www.cnblogs.com/talk/p/2680591. ...

  5. 初学java之异常类

    //异常类 package st; public class example_1 { public static void main(String args[]) { int n=0,m=0,t=10 ...

  6. java 学习笔记——类之间的关系之封装、继承与多态的详解

    封装 一个封装的简单例子 封装就是把对象的属性(状态)和方法(行为)结合在一起,并尽可能隐蔽对象的内部细节,成为一个不可分割的独立单位(即对象),对外形成一个边界,只保留有限的对外接口使之与外部发生联 ...

  7. [Java学习]面向对象-类的继承;方法覆盖

    一.类的继承 实现方法: public Class SubClass extends SuperClass{ } 继承最基本作用: 代码重用. 继承最重要的作用: 方法可以重写. 关于类的继承: 子类 ...

  8. 【Java】异常类处理层次

    异常处理简介 异常在java的开发中可能没有那么被重视.一般遇到异常,直接上抛,或者随便catch一下处理之后对于程序整体运行也没有什么大的影响.不过在企业级设计开发中,异常的设计与处理的好坏,往往就 ...

  9. JAVA常用异常类

    算数异常类:   ArithmeticExecption 空指针异常类:    NullPointerException 指定类不存在:    ClassNotFoundException 字符串转换 ...

  10. Java学习--Calendar 类的应用

    Calendar 类的应用 Date 类最主要的作用就是获得当前时间,同时这个类里面也具有设置时间以及一些其他的功能,但是由于本身设计的问题,这些方法却遭到众多批评,不建议使用,更推荐使用 Calen ...

随机推荐

  1. python的内置模块time和datetime的方法详解以及使用(python内的time和datetime时间格式)

    time内置模块的方法 1.time() 时间戳 time() -> floating point number  浮点数 Return the current time in seconds ...

  2. Hadoop生态圈-使用phoenix的API进行JDBC编程

    Hadoop生态圈-使用phoenix的API进行JDBC编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  3. js+css3实现旋转效果

    我的前面一张文章实现了用css3制作旋转的效果,现在呢,我换另外一种方法来实现.就是使用js结合css3的方法来实现的.下面我就先上图给大家看看效果吧 下面呢我先放上我的css代码,代码很简单: .o ...

  4. SourceTree免密克隆仓库及问题说明

    前言说明: 公司陆陆续续进新员工,新员工都需要了解公司各类资料,而公司资料都存储于gitlab中,因此,新员工需要安装工具进行资料拉取. 公司采用SourceTree的是工具.相关下载地址如下: WI ...

  5. 使用abcpdf将html转换成pdf文件

    ABCpdf.NET使用介绍 最新做一个项目需要生成pdf文档以供打印,研究决定使用abcpdf这款组件,先针对其使用方法做一个简单的总结介绍以给有需要的朋友做参考. 一. ABCpdf.NET简单介 ...

  6. VBS 重启 TP-Link 路由器

    分享一个自己用的小工具,重启TP-Link路由器的,好像还是大学时候写的,献丑了. 其他路由器可能有些不同,但是思路都是差不多的. user = "admin" '路由器帐号 pa ...

  7. 网页制作中最有用的免费Ajax和JavaScript代码库

    网上看到的一篇小文,挺有用的,收藏在这. 本文中,我整理了12个免费的Ajax和JavaScript代码库,可以帮助Web开发人员将应用程序提升到一个新水平. Ajax Instant Messeng ...

  8. 【leetcode 简单】 第六十八题 二叉搜索树的最近公共祖先

    给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 x ...

  9. 如何开启一个Django项目

    一:新建的Django工程 新建了一个Django工程后,工程会自动创建有两个templates文件夹和unitled文件夹,再加上一个manage.py文件. 二:Django开发的一般流程 在工程 ...

  10. 基于Vue + Vuex + Vue-router + Webpack 2.0打造微信界面

    一.项目简介 基于Vue + Vuex + Vue-router + Webpack 2.0打造微信界面,实现了微信聊天.搜索.点赞.通讯录(快速导航).个人中心.模拟对话.朋友圈.设置等功能. 二. ...