异常的根类是 java.lang.Throwable
异常处理的优点:它能使方法抛出一个异常给它的调用者,由调用者处理该异常。
key word : try、 catch 、 finally、 throws

1. 一般形式

throw new ArithmeticException(“XXX”);
// java.lang.ArithmeticException,在方法中使用。当异常被抛出,正常的执行流程被中断

try { 正常代码 }

catch( 异常类型 ) { 处理或者抛出异常 } 可以存在多个catch块,或者使用 | 在一个块内声明

finally { 此处的语一定会被执行 }

注意,不要用try-case块处理简单、可预料的情况!!!

2. finally

在任何情况下,finally块中的代码都会被执行,不论try块中是否出现异常或者是否被捕获。考虑下面三种可能出现的情况:

如果try块中没有出现异常,执行finalStatements,然后执行try语句的下一条语句。
如果try块中有一条语句引起异常,并被catch捕获,然后跳过try块的其他语句,执行catch块和finally子句。执行try语句之后的下一条语句。
如果try块中有一条语句引起异常,但是没有被任何catch块捕获,就会跳过try块中的其他语句,执行finally子句,并且将异常传递给这个方法的调用者。
即使在到达finally块之前有一个return语句,finally块还是会执行。

3.throw 和 throws

throws与throw这两个关键字接近,不过意义不一样,有如下区别:

  • throws 出现在方法声明上,而throw通常都出现在方法体内。
  • throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某个异常对象。

4. 异常分类

所有的java异常类都直接或者间接地继承自Throwable。可以通过继承Exception或者Exception的子类来创建自己的异常类。

异常类有三种主要类型:

异常 (Exception) 又叫可查异常: CheckedException,是必须进行处理的异常,要么try catch,要么往外抛,谁调用,谁处理,如果不处理,编译器就不让你通过。

系统错误/Error (System Error)是由java虚拟机抛出的,用Error类表示,不要求强制捕获
Error类描述的是内部系统错误,这样的错误很少发生。如果发生,除了通知用户以及尽量稳妥地终止程序外,几乎什么也不能做。常见的有:内存用光了,抛出OutOfMemoryError
 
运行时异常 (Runtime Exception)是用RuntimeException类表示的,它描述的是程序设计错误, 不是必须进行try catch。在编写代码的时候,依然可以使用try catch throws进行处理,与可查异常不同之处在于,即便不进行try catch,也不会有编译错误。运行时异常通常是由Java 虚拟机抛出的。

Exception这个层次结构又分解为连个分支:一个分支派生于RuntimeException;另一个分支包含其他异常。划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有没有问题,但由于像I/O错误这类异常导致的异常属于其他异常。

常见的RuntimeException(运行时异常):

IndexOutOfBoundsException(下标越界异常)
NullPointerException(空指针异常)
NumberFormatException (String转换为指定的数字类型异常)
ArithmeticException -(算术运算异常 如除数为0)
ArrayStoreException - (向数组中存放与声明类型不兼容对象异常)
SecurityException -(安全异常)
IOException(其他异常)
FileNotFoundException(文件未找到异常。)
IOException(操作输入流和输出流时可能出现的异常。)
EOFException (文件已结束异常)

5. 自定义异常

我们可以创造一个类,继承某个自定义的异常。
public class DefineException extends Exception{

}

如果方法没有在父类中声明异常,那么就不能再子类中对其进行继承来声明异常。

在catch块中异常被指定的顺序是非常重要的,如果父类的catch块出现在唉子类的catch块之前,就会导致编译错误。

修改我们之前的类Circle

// Circle.java
public class Circle {private double radius;private static int circleNumber =0;/*   set radius */Circle(){circleNumber++;radius = 1.0;}Circle(double newRadius){setRadius(newRadius);circleNumber++;}/* return radius */public double getRadius() {return radius;}/* set radius public void setRadius(double radius) { this.radius = (radius >=0) ? radius : 0;} */   public void setRadius(double radius) throws IllegalArgumentException{
/* 即使在方法声明中删除throws IllegalArgumentException 子句,
Circle类也仍然会编译,因为该异常是RuntimeException 的子类,
而且不管是否在方法头中声明,每个方法都能抛出RuntimeException 异常(免检异常)。*/if (radius>=0)  this.radius=radius;else throw new IllegalArgumentException("radius cannot be negative");} /* get the number of all circles */public static int getNumberOfCircle() {return circleNumber;}public double getArea(){return radius*radius*Math.PI;}
}

测试程序:

//  testCircle.java
public class testCircle {public static void main(String[] args) {// TODO Auto-generated method stubtry {Circle c1 = new Circle(-2);Circle c2 = new Circle(5);Circle c3 = new Circle();Circle c4 = new Circle(0);}catch (IllegalArgumentException ex) {System.out.println(ex);}System.out.println("the number of circle is : " + Circle.getNumberOfCircle());}
}

观察程序的运行结果,我们发现:当c1出现异常,成功catch后,不会再返回执行Circle c2 = new Circle(5)以及后续语句;程序会顺着catch块后继续执行。

basic knowledge:
在执行完catch 块之后,程序控制不返回到throw 语句;而是执行catch 块后的下一条语句

自定义异常代码

//  DefineException.java
public class DefineException extends Exception {private double radius;public DefineException(double radius) {super("Invaild radius "+radius);this.radius= radius;}public double getRadius() {return radius;}
}// Circle.java
public class Circle {private double radius;private static int circleNumber =0;/*   set radius */Circle() throws DefineException {circleNumber++;radius = 1.0;}Circle(double newRadius) throws DefineException{setRadius(newRadius);circleNumber++;}/* return radius */public double getRadius() {return radius;}public void setRadius(double radius) throws DefineException{  if (radius>=0)  this.radius=radius;else throw new DefineException(radius);}/* get the number of all circles */public static int getNumberOfCircle() {return circleNumber;}public double getArea(){return radius*radius*Math.PI;}
}
//  testCircle.java
public class testCircle {public static void main(String[] args) {// TODO Auto-generated method stubtry {Circle c1 = new Circle(-2);Circle c2 = new Circle(5);Circle c3 = new Circle(6);Circle c4 = new Circle(0);}catch (DefineException ex) {System.out.println(ex);}finally {System.out.println("finally");}System.out.println("the number of circle is : " + Circle.getNumberOfCircle());}
}

转载于:https://www.cnblogs.com/l20902/p/10610889.html

java基础:8.1 异常相关推荐

  1. java基础day11---空指针异常----引用类型--自定义类型赋值--封装

    day11 1.空指针异常--- --属于运行错误-java.long.NullPointerException --原因:当引用名称的值为null时,就不能访问某个对象中的属性或方法 热锅非要访问这 ...

  2. Java基础篇:异常机制

    目录: 一.为什么使用异常: 二.异常体系: 三.异常的捕捉--try.catch.finally: 四.关于异常的题: 五.自定义异常: 六.异常链: 七.异常的使用误区: 八:throw.thro ...

  3. java基础 —— 集合、异常、反射、io流、多线程

    1.集合 (Collection) #mermaid-svg-Po6HS0iqu2RMZvt5 .label {font-family: 'trebuchet ms', verdana, arial; ...

  4. Java 基础系列:异常

    Java 中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行的程序的正常指令流.为了能够及时有效地处理程序中的运行错误,必须使用异常类. 1. 异常类型 Thro ...

  5. 黑马程序员 — JAVA基础 — 内部类、异常

    -----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 一.内部类 1.概念: 把类定义在另一个类的内部,该类就被称为内部类. Eg:把 ...

  6. Java基础——运行时异常和非运行时异常

    文章目录 Java中异常机制的体系结构 Error(错误) Exception(异常) 运行时异常和非运行时异常的区别 结束 Java中异常机制的体系结构 在Java中,万物皆对象,异常也不例外. E ...

  7. [Java基础]并发修改异常

  8. java 数字运算异常_Java基础之:异常及异常处理

    Java基础之:异常及异常处理 我们将java程序执行过程中出现的不正常现象称为异常,例如:之前遇到的数组下标越界异常,空指针异常等等 执行过程中发生的异常事件分为两类: Error(错误):Java ...

  9. 【程序员养成之路】Java基础篇 8-流进流出的IO流(二)

    以下内容若有误,欢迎私信我或在下方留言,谢谢^_− 目录 IO流(二) 1.特殊操作流 1.1 标准流 1.2 打印流 1.3 对象序列化流 1.4 Properties 拓展1:比较字节流和字节缓冲 ...

  10. 第一阶段>>>Java基础进阶 OOP/Reflect/注解/IO流/API核心

    目录 >>>java基础01-结构以及类型 >>>java基础02-初识数组 >>>java基础03-面向对象OOP >>>ja ...

最新文章

  1. poj3468 A Simple Problem with Integers
  2. 机器学习笔记(5) KNN算法
  3. docker中开启时运行多个不同进程,安装ssh,并在启动docker时与jenkins同时启动运行
  4. 区分中英文字符的两种方法: 正则和charCodeAt()方法
  5. 教你如何谷歌浏览器免费打电话
  6. 面向对象程序设计第二次作业(2)
  7. 前后落差大用什么词语_语文考题一共有五类:汉字类、词语类、句子类、阅读类、作文类,如果基础扎实,答题技巧弄懂了,哪一类都能拿高分!...
  8. DOTNET Core MVC(二)路由初探
  9. mysql groupby rullup_关于group by的深入理解(扩展到rollup,增强groupby,主要用于小计)
  10. WordPress精美免费主题分享系列之新闻风格篇
  11. html绝对定位怎么页面居中,html – 如何将绝对定位的元素居中?
  12. 基于JAVA+SpringMVC+Mybatis+MYSQL的论坛管理系统
  13. 思科网络工程师面试题
  14. Unity【HTC Vive Noitom】- 关于动作捕捉的两种解决方案
  15. 一分钟教会你烫了头发该怎么打理
  16. jmap和jstat
  17. 如何申请开通个人邮箱?
  18. 云服务器CPU Intel Xeon Platinum 8163(Skylake)处理器性能评测
  19. java实现word文档转pdf功能(无水印)
  20. 全终端办公电子邮件集成方案

热门文章

  1. mysqluuid去除横岗
  2. Stopping filebeat
  3. Spring Boot 整合 Netty和Protobuf
  4. CSS使表格不变形(原创)
  5. mysql 实时恢复_MySQL实时在线备份恢复方案:Replication+LVM Snapsho
  6. html5游戏开发实战第三章,我的启蒙--HTML5 第三章 Canvas
  7. java 正则表达式 判断 日期_怎么在java中利用正则表达式对时间日期进行判断
  8. go json tag 字符串 整数_json:你或许还不知道的序列化操作(一)
  9. linux僵尸进程理解,聊聊Linux系统中的僵尸进程
  10. 电芯容量在前期循环中容量增加_安普瑞斯王岑博士:安普瑞斯的硅负极材料在高能量密度电池中的应用进展...