文档章节

Java 异常基础 Exception

qsyan
 qsyan
发布于 2015/07/09 22:21
字数 1186
阅读 68
收藏 4

IDEA 开发交流群:185441009


java.lang.Exception类是Java中所有异常的直接或间接父类。即Exception类是所有异常的根类。

  比如程序: 


public class ExceptionTest { public static void main(String[] args) { int a = 3; int b = 0; int c = a / b; System.out.println(c); } }

 

  编译通过,执行时结果:

  Exception in thread "main" java.lang.ArithmeticException: / by zero

     at com.learnjava.exception.ExceptionTest.main(ExceptionTest.java:9)

  因为除数为0,所以引发了算数异常。

 

  比较常见的异常还有这种:空指针异常

  java.lang.NullPointerException是空指针异常,出现该异常的原因在于某个引用为null,但却调用了它的某个方法,这时就会出现该异常。

 

Java中的异常分为两大类:

  1.Checked ExceptionRuntime Exception

  2.Unchecked ExceptionRuntime Exception

运行时异常

  RuntimeException类是Exception类的子类,它叫做运行时异常,Java中的所有运行时异常都会直接或者间接地继承自RuntimeException类。

  Java中凡是继承自Exception,而不继承自RuntimeException类的异常都是非运行时异常

 

异常处理的一般结构


try { // 可能发生异常的代码   // 如果发生了异常,那么异常之后的代码都不会被执行  } catch (Exception e) { // 异常处理代码  } finally { // 不管有没有发生异常,finally语句块都会被执行 }

  比如本文最开始的除法运算代码,加入异常处理之后: 


public class ExceptionTest { public static void main(String[] args) { int c = 0; try { int a = 3; int b = 0; // 这块代码出现了异常 c = a / b; // 那么异常之后的代码都不会被执行 System.out.println("Hello World"); } catch (ArithmeticException e) { e.printStackTrace(); } finally { //不管有没有发生异常,finally语句块都会被执行 System.out.println("Welcome"); } System.out.println(c); // 当b为0时,有异常,输出为c的初始值0 } }


多个catch

  一个try后面可以跟多个catch,但不管多少个,最多只会有一个catch块被执行。

 

异常处理方法

  对于非运行时异常(checked exception),必须要对其进行处理,否则无法通过编译。

  处理方式有两种:

  1.使用try..catch..finally进行捕获;

  2.在产生异常的方法声明后面写上throws 某一个Exception类型,如throws Exception,将异常抛出到外面一层去。

  对非运行时异常的处理详见代码例子:

  处理方式1:将异常捕获

  将异常捕获

  处理方式2:将异常继续向外抛出

  将异常抛出

 

  对于运行时异常(runtime exception),可以对其进行处理,也可以不处理。推荐不对运行时异常进行处理。

 

自定义异常

  所谓自定义异常,通常就是定义一个类,去继承Exception类或者它的子类。因为异常必须直接或者间接地继承自Exception类。

  通常情况下,会直接继承自Exception类,一般不会继承某个运行时的异常类。

  自定义异常可以用于处理用户登录错误,用户输入错误提示等。

  自定义异常的例子:

  自定义一个异常类型: 


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

  一种异常处理方式:

一种异常处理方式

  另一种异常处理方式:

异常处理方式二

 

  前面说过,可以有多个catch块,去捕获不同的异常,真正执行的时候最多只进入一个catch块

  下面这个例子,定义了两种自定义的异常类型:

  多种异常

 

  我们可以使用多个catch块来捕获异常,这时需要将父类型的catch块放到子类型的catch块之后,这样才能保证后续的catch块可能被执行,否则子类型的catch块将永远无法到达,Java编译器会报错。

  如果异常类型是独立的,那么它们的前后顺序没有要求。

  如对上面的代码进行改动后,如下列出:

  多个catch语句块的顺序

 

面试常考题型

  try块中的退出语句

  虽然实际开发中不会遇到这样的情况,但是笔试面试时有关异常经常会问到如下情况:

  笔试面试题解析


  在加上return语句前,程序输出:

    进入到try块

    进入到finally块

    后续代码

 

  如果在try块中加入return语句:

  程序执行输出:

    进入到try块

    进入到finally块

 

  说明try块中有return语句时,仍然会首先执行finally块中的语句,然后方法再返回。

  如果try块中存在System.exit(0);语句,那么就不会执行finally块中的代码,因为System.exit(0)会终止当前运行的Java虚拟机,程序会在虚拟机终止前结束执行。

本文转载自:http://www.cnblogs.com/mengdd/archive/2013/02/03/2890923.html

共有 人打赏支持
qsyan
粉丝 30
博文 38
码字总数 7103
作品 1
宝鸡
其他
私信 提问
Android JNI开发系列(十三) JNI异常处理

JNI 异常处理 JNI异常与JAVA处理异常的区别 JAVA 有异常处理机制,而JNI没有 如果JAVA中异常没有捕获,后面的代码不会执行,JNI会执行 JAVA编译时的异常,是在方法显示的声明了某一个异常,编...

蔡小鹏
2018/10/20
0
0
Java for Web学习笔记(一三七)篇外之数据库的ACID和JPA(1)原子性

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/flowingflying/article/details/82863712 ACID大家都听过,看似也了解,但是在实际的项目中,发现不是所有人都...

恺风
2018/09/27
0
0
第十四讲 面向对象基础——异常

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yerenyuan_pku/article/details/82084172 异常的概述 异常就是程序在运行时出现的不正常情况。我们不仅要问异...

李阿昀
2018/08/26
0
0
Java学习系列文章:说说Java中的异常

在正常的程序设计中,程序异常处理是非常关键和重要的一部分。试想一个项目中没有一个好的异常处理,这个项目会怎么样? 什么是异常 异常其实是程序上的错误,包括程序逻辑错误和系统错误。比...

java高级架构牛人
2018/06/29
0
0
异常的概念和Java异常体系结构

一、 异常的概念和Java异常体系结构 异常是程序运行过程中出现的错误。本文主要讲授的是Java语言的异常处理。Java语言的异常处理框架, 是Java语言健壮性的一个重要体现。 Java把异常当作对象...

杭州_周陶忠
2013/09/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 升级中的一些常见问题

升级的时候遇到了问题了吗? 如果你想尝试重新进行升级的话,你需要首先重新恢复老的备份。不要尝试再次对 Confluence 进行升级或者在升级失败后重新启动老的 Confluence。 在升级过程中的一...

honeymoose
今天
2
0
C++随笔(四)Nuget打包

首先把自己编译好的包全部准备到一个文件夹 像这样 接下来新建一个文本文档,后缀名叫.nuspec 填写内容 <?xml version="1.0"?><package xmlns="http://schemas.microsoft.com/packaging/201......

Pulsar-V
今天
2
0
再谈使用开源软件搭建数据分析平台

三年前,我写了这篇博客使用开源软件快速搭建数据分析平台, 当时收到了许多的反馈,有50个点赞和300+的收藏。到现在我还能收到一些关于dataplay2的问题。在过去的三年,开源社区和新技术的发...

naughty
今天
12
0
Python3的日期和时间

python 中处理日期时间数据通常使用datetime和time库 因为这两个库中的一些功能有些重复,所以,首先我们来比较一下这两个库的区别,这可以帮助我们在适当的情况下时候合适的库。 在Python文...

编程老陆
今天
2
0
分布式面试整理

并发和并行 并行是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用,但是每一次,只能有...

群星纪元
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部