异常

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

注意:

  1. 在Java等面向对象编程语言当中,异常本身是一个类,产生异常的本质就是抛出一个异常对象。Java对异常采取中断处理方式。
  2. Throwable类是所有错误类和异常类的超类。Throwable类有两大子类——Error和Exception.
  3. Error是错误,是程序员所无法处理的错误。Exception是异常,异常产生后程序员可以通过代码纠正异常。
  4. Exception的子类一般都是编译器异常,但是有一个特殊的子类 RuntimeException ,它是运行期异常。
  5. 处理异常的方式有两种,一种是throws抛出异常,一种是try、catch抓取并且处理异常。

重要知识点:

Throwable中定义了处理异常的三个方法,分别是:

String getMessage();

返回此 throwable 的详细消息字符串。

String toString();

返回此 throwable 的简短描述。

void printStackTrace();

将此 throwable 及其追踪输出至标准错误流。

throw用法

  1. throw关键字必须写在方法的内部,后面跟的是异常对象名。
  2. 能且只能抛出一个对象名。
  3. throw后边new的对象必须是Exception或者是Exception的子类对象。
  4. throw只是单纯的抛出异常。
  5. throw关键字抛出指定的异常对象,我们就必须处理这个异常对象(如果创建的是RuntimeException或者它的子类对象就可以选择不处理,留给JVM处理)。
  6. 如果throw后面创建的是编译异常(写代码时就报错),我们就必须处理这个异常。

throws用法

  1. throws关键字用在方法声明处,具体位于方法大括号前面。
  2. throws关键字声明的异常必须是Exception或者Exception的子类。
  3. throws关键字可以跟多个异常类名,用逗号隔开。
  4. 方法内部用throw抛出的所有异常,都必须在定义方法时用throws声明异常(如果异常类存在子父类关系,则只需抛出父类即可)。
  5. throws关键字只是单纯的声明异常(当前方法存在的异常),留给其他调用此方法的方法处理异常,如果其他方法没有处理,将最终留给JVM中断处理。
  6. 如果调用了声明异常的方法,必须对声明的异常进行处理。方法有两种。① 继续使用throws关键字抛出,留给下一个调用此方法的方法。② 使用try,catch处理异常。

测试代码:

package com.lanyue.day20;

public class ThrowAbleLearn throws ArithmeticException{

    public static void main(String[] args) {

        System.out.println(getData(1,0));
} public static int getData(int divisor,int dividend){ if(dividend == 0){ throw new ArithmeticException("除数不能为零"); }else{ return divisor / dividend;
}
}
}

try......catch......finally

try{

}catch(XXXException e){

}

catch(XXXException e){

}

......

finally{

//无论是否发生异常,这里的代码必将执行。

}

注意:

  1. catch语句可以有多个,用来抓取不同类型的异常。
  2. 如果try中出现了异常,就会执行catch块中的逻辑代码。
  3. 如果catch小括号内抓取的异常类型并不是try中发生异常类的父类或同类,则并不会引起catch大括号内容的执行。
  4. 可以结合Throwable类中处理异常的三个方法进行处理异常。
  5. finally代码块是配合try一起使用的,finally块中的代码一定会执行(无论是否发生异常)。
  6. 面对多个可能发生异常的语句,既可以对每个语句都执行try...catch抓获,也可以只用一个try...catch抓获多个异常。
  7. 如果使用一个try...catch语句抓获多个异常事件。需要注意:如果catch抓取的异常类有子父类关系,则子类必须写在父类的上面。
  8. finally代码块中可以写return语句,且无论如何,finally所在的方法都会返回该return语句。所以如果没有十足的把握,尽量不要在finally代码块中写return语句。
  9. 如果父类方法抛出了异常,则子类重写父类方法时,需要抛出和父类相同的异常,或者是父类抛出异常类的子类,或者就不抛出异常。
  10. 如果父类方法没有抛出异常,则子类也不可抛出异常。如果确实产生了异常,只能使用try catch语句抓捕异常,不能声明抛出。

自定义异常类:

很多情况下,依靠Java自身定义的异常类是无法满足需求的。这个时候,我们就需要自定义异常类。

定义格式:

public XxxException extends Exception | RuntimeException{

    public XxxException(){...}
public XxxException(){...} }

注意事项:

  1. 异常类结尾最好是Exception,用以说明此类是异常类对象。
  2. 自定义异常类必须继承自Exception或者RuntimeException类。
  3. 自定义异常类内部必须实现空参和一个参数(字符串)的构造函数。
  4. 构造函数可以且建议使用父类方法执行(super()和super(String s))。

代码测试:

package com.lanyue.day21;

public class MyException extends Exception {

    public MyException() {
super();
} public MyException(String message) {
super(message);
}
}
package com.lanyue.day21;

public class Demo {

    public static void main(String[] args) {

        method(5,1);
} public static void method(int a,int b){ if(b == 1){ try { throw new MyException("除数为1没有实际的计算意义"); } catch (MyException e) { System.out.println("没有计算价值");
}
}
}
}

Java第二十二天,异常的更多相关文章

  1. 学JAVA第二十二天,StringBuffer的好处

    五一的假期今天就结束了,又要回来上课了. 今天就写一下StringBuffer的好处吧. StringBuffer类的对象能够被多次的修改,并且不产生新的未使用对象. 也就是说,我们平时用String ...

  2. javaSE第二十二天

    第二十二天    312 1:登录注册IO版本案例(掌握)    312 2:数据操作流(操作基本类型数据的流)(理解)    313 (1)定义:    313 (2)流对象名称    313 (3 ...

  3. Core Java 总结(异常类问题)

    所有代码均在本地编译运行测试,环境为 Windows7 32位机器 + eclipse Mars.2 Release (4.5.2) 2016-10-17 整理 下面的代码输出结果是多少?为什么?并由 ...

  4. Java基础学习 -- 异常

    当异常发生时,原本要接着执行的代码不再执行,转而让其他部分的代码来处理.如果没有代码负责处理,控制台会报告异常. 异常出现时的执行机制: 异常机制最大的好处是:清晰地分开了 正常的业务逻辑 和 遇到情 ...

  5. 关于java中的异常问题 1

    1.首先参考一下关于java异常处理方面的知识 查看博客http://lavasoft.blog.51cto.com/62575/18920/ 这里介绍的很好,下面从中学习到一些东西,摘抄如下: 1. ...

  6. Java throw:异常的抛出怎么回事

    到目前为止,你只是获取了被Java运行时系统抛出的异常.然而,程序可以用throw语句抛出明确的异常.Throw语句的通常形式如下:    throw ThrowableInstance;这里,Thr ...

  7. [改善Java代码] 提倡异常的封装

    JavaAPI提供的异常都是比较低级别的,低级别是指只有开发人员才能看懂的异常.而对于终端用户来说基本上就是天书,与业务无关,是纯计算机语言的描述. 异常封装的三方面的好处: 1)提高系统的友好性   ...

  8. java第二周学习日记

    day01 1.抽象类 (1)抽象类的应用场景: 我们在描述一类事物的时候,发现该种事物确实存在着某种行为,但是这种行为目前不是具体的,那么我们可以抽取这种行为的声明,但是不去实现该种行为,这时候这种 ...

  9. 点评阿里JAVA手册之异常日志(异常处理 日志规约 )

    下载原版阿里JAVA开发手册  [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:异常处理 日志规约 本文难度系数为一星(★) 本文为第三篇 ...

随机推荐

  1. Python1-变量

    一.变量和简单数据类型 1.变量 命名规则: 变量名组成——字母.下划线.数字(不可做首字符): 用下划线分隔单词,不可包含空格: 关键字和函数名不可做变量名: 小写字母做变量名,不建议使用大小写的字 ...

  2. 某些时候 v-if 会导致 v-modal 内部数据获取不到 也watch不到,这个时候用v-show即可,另外提一下数组要整体赋值才有双向绑定

    某些时候 v-if 会导致 v-modal 内部数据获取不到 也watch不到,这个时候用v-show即可,另外提一下数组要整体赋值才有双向绑定

  3. 深夜,我用python爬取了整个斗图网站,不服来斗

    QQ.微信斗图总是斗不过,索性直接来爬斗图网,我有整个网站的图,不服来斗. 废话不多说,选取的网站为斗图啦,我们先简单来看一下网站的结构 网页信息 从上面这张图我们可以看出,一页有多套图,这个时候我们 ...

  4. c# winform 访问WebServices (通过Http方式)

    第一步.编写WebServices服务方法 [WebMethod] public void PostJson(string str, string bb) { Dictionary<string ...

  5. Js的new运算符

    new运算符 在JavaScript中,new是一个语法糖,可以简化代码的编写,可以批量创建对象实例. 语法糖Syntactic sugar,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影 ...

  6. hdu1045 炮台的配置 dfs

    只要炮台在同一行或者同一列,就可以互相摧毁,遇到墙则无法对墙后的炮台造成伤害,可以通过dfs搜索n*n的方格,全部搜完算一轮,计算炮台数,并保存其最大值. 其中对于t编号的炮台,位置可以计算出是(t/ ...

  7. 洛谷1514 引水入域 dp+记忆化搜索

    题目链接:https://www.luogu.com.cn/problem/P1514 题意大致是:给定一个(n,m)的数值矩阵,可以在第一行建造水库,如果一个格子周围的某格子值小于它,那水就可以流到 ...

  8. Linux网络学习笔记(二):域名解析(DNS)——以 CoreDNS 为例

    个人笔记,观点不一定正确. 适合对 Kubernetes 有一定了解的同学. 前言 最近一直在学习 Kubernetes,但是手头没有个自有域名,要测试 ingress 就比较麻烦,每次都是手动改 h ...

  9. Hive架构原理

    什么是Hive Hive是由Facebook开源用于解决海量结构化日志的数据统计:Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射 成一张表,并提供类SQL查询功能,底层计算引 ...

  10. OpenCV-Python 哈里斯角检测 | 三十七

    目标 在本章中, 我们将了解"Harris Corner Detection"背后的概念. 我们将看到以下函数:cv.cornerHarris(),cv.cornerSubPix( ...