程序中总是存在着各种问题,为了使在程序执行过程中能正常运行,使用Java提供的异常处理机制捕获可能发生的异常,对异常进行处理并使程序能正常运行。这就是Java的异常处理。

一、可捕获的异常

  Java中可以捕获的异常分为可控式和运行时异常。

  1. 可控式异常

  在Java中把那些可以预知的错误,在程序编译时就能对程序中可能存在的错误进行处理,并给出具体的错误信息,这些错误称为可控式异常。常用的可控式异常如下:

异常 说明
IOException 当发生某种I/O异常时,抛出此异常
SQLException 提供关于数据库访问错误或其他错误信息的异常
ClassNotFoundException 类没有找到异常
NoSuchFieldException 类不包含指定名称的字段时产生的信号
NoSuchMethodException 无法找到某一特定方法时,抛出该异常

  2. 运行时异常

  在Java中不能被编译器检测到的错误称为运行时异常。常用的运行时异常如下:

 异常  说明
 IndexOutOfBoundsException  指示某集合或数组的索引值超出范围时抛出该异常
 NullPointerException  当应用程序试图在需要对象的地方使用null时,抛出该异常
 ArithmeticException  当出现异常的运算条件时,抛出此异常
 IllegalArgumentException  抛出异常的表明向方法传递了一个不合法或不正确的的参数
 ClassCastException  当试图将对象强制转换为不是实例的子类时,抛出该异常

二、处理异常

  在Java中当程序出现异常时,可以使用try···catch、try···catch···finally或try···finally进行处理。

  1. 使用try···catch处理异常

  try后是正常执行的语句,而catch后是对异常处理的语句,catch的括号中是程序需要处理的异常类型。语法格式如下:

try {
正常执行的语句
} catch(Exception e) {
对异常进行处理的语句
}

  这里举一个算数异常的例子,如下。

 public class ExceptionTest {

     public static void main(String[] args) {
int result = 1 / 0;
try {
System.out.println(result);
} catch (Exception e) {
System.out.println("抛出异常:" + e.getMessage());
}
} }

  这里1/0是个异常的算法,因为除数不能为0。运行结果如下:

  

  因为有异常,所以不执行try后的语句,从而执行catch后的语句。其中“e.getMessage()”是获取异常信息的方法,用于获取详细消息字符串;此外还有printStackTrace()方法,用于将其栈踪迹输出至标准错误流;toString()方法用于获得简短描述。

  2. 使用try···catch···finally处理异常

  这里try、catch后的语句与前面的相同,而finally后的语句无论是否发生异常都要执行,因此finally语句块通常用于执行垃圾回收。语法格式如下:

try {
正常执行的语句
} catch(Exception e) {
对异常进行处理的语句
} finally {
一定会被处理的语句
}

  3. 使用try···finally处理异常

  在程序发生异常时,就可以在finally语句块中对其进行相应的处理,另外当程序没有发生异常时,执行完try和finally之间的语句后,也将执行finally语句块中的代码。语法格式如下:

try {
需要执行的语句
} finally {
一定会被处理的语句
}

三、抛出异常

  对于程序中发生的异常,除了上面的try···catch语句处理之外,还可以使用throws声明或throws语句抛出异常。

  1. 使用throws声明抛出异常

  throws用于方法声明,在声明方法时使用throws声明抛出异常,然后在调用该方法中对异常进行处理。

  如需声明多个异常,各异常间要用逗号分隔,语法格式如下:

数据类型 方法名(形参列表) throws 异常类1, 异常类2, ……, 异常类n {
方法体;
}

  比如用throws抛出Exception异常。

public void showInfo() throws Exception {        // 抛出Exception
FileInputStream in = new FileInputStream("C://Record.txt"); // 创建IO对象
}

  2. 使用throw语句抛出异常

  如果希望程序自行抛出异常,可以使用throw语句来实现。语法格式如下: throw new Exception("对异常的说明");

  使用throw语句抛出的是异常类的实例,通常与if语句一起使用。如:

if(x < 0) {
throw new Exception("程序异常,x不能小于0。");
}

Java进阶篇(四)——Java异常处理的更多相关文章

  1. Java线程间通信方式剖析——Java进阶(四)

    原创文章,同步发自作者个人博客,转载请在文章开头处以超链接注明出处 http://www.jasongj.com/java/thread_communication/ CountDownLatch C ...

  2. java提高篇(四)-----理解java的三大特性之多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

  3. Java总结篇:Java多线程

    Java总结篇系列:Java多线程 多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: ...

  4. Java进阶(三十七)java 自动装箱与拆箱

    Java进阶(三十七)java 自动装箱与拆箱 前言 这个是jdk1.5以后才引入的新的内容.java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装称为装箱,解包装称为 ...

  5. java提高篇-----理解java的三大特性之封装

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  6. Java进阶篇(六)——Swing程序设计(上)

    Swing是GUI(图形用户界面)开发工具包,内容有很多,这里会分块编写,但在进阶篇中只编写Swing中的基本要素,包括容器.组件和布局等,更深入的内容会在高级篇中出现.想深入学习的朋友们可查阅有关资 ...

  7. Java进阶篇(六)——Swing程序设计(下)

    三.布局管理器 Swing中,每个组件在容器中都有一个具体的位置和大小,在容器中摆放各自组件时很难判断其具体位置和大小,这里我们就要引入布局管理器了,它提供了基本的布局功能,可以有效的处理整个窗体的布 ...

  8. Java进阶篇(五)——Java的I/O技术

    程序中,为了永久的保存创建的数据,需要将其保存在磁盘文件中,以便在其它程序中使用它们.Java的I/O技术可以将数据保存到文本文件.二进制文件甚至是ZIP压缩文件中,以达到永久性保存数据的要求. 本篇 ...

  9. Java进阶篇(一)——接口、继承与多态

    前几篇是Java的入门篇,主要是了解一下Java语言的相关知识,从本篇开始是Java的进阶篇,这部分内容可以帮助大家用Java开发一些小型应用程序,或者一些小游戏等等. 本篇的主题是接口.继承与多态, ...

  10. Java进阶篇(三)——Java集合类

    集合可以看作一个容器,集合中的对象可以很容易存放到集合中,也很容易将其从集合中取出来,还可以按一定的顺序摆放.Java中提供了不同的集合类,这些类具有不同的存储对象的方式,并提供了相应的方法方便用户对 ...

随机推荐

  1. Javascript流程控制

    Javascript流程控制 1.条件语句 (1)if(exp)执行一句代码 (2)if(exp){执行代码段;} (3)if(exp){exp为true执行代码段}else{exp为false执行的 ...

  2. 关于Oracle开启自动收集统计信息的SPA测试

    主题:关于Oracle开启自动收集统计信息的SPA测试 环境:Oracle RAC 11.2.0.4(Primary + Standby) 需求:生产Primary库由于历史原因关闭了自动统计信息的收 ...

  3. [Spark内核] 第38课:BlockManager架构原理、运行流程图和源码解密

    本课主题 BlockManager 运行實例 BlockManager 原理流程图 BlockManager 源码解析 引言 BlockManager 是管理整个Spark运行时的数据读写的,当然也包 ...

  4. KMP算法讲解

    老规矩,讲算法前,先说一道小问题吧 给你一个长串和短串,求短串在长串中出现的次数和位置. 设长串长度为len1,短串长度为len2. 如果len1*len2<=108,那就很简单了,直接暴力枚举 ...

  5. LAMP源码安装,搭建zabbix监控

    #LAMP#httpd-2.2.32#mysql-5.7.17-linux-glibc2.5-x86_64 二进制压缩版#php5.3.27 1.系统环境优化检查 sed -i 's/SELINUX= ...

  6. 【dfs】POJ2386湖计数

    Lake Counting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34735   Accepted: 17246 D ...

  7. .NET Core单文件发布静态编译AOT CoreRT

    .NET Core单文件发布静态编译AOT CoreRT,将.NET Core应用打包成一个可执行文件并包含运行时. 支持Windows, MacOS and Linux x64 w/ RyuJIT ...

  8. Linux磁盘分区/格式化/挂载(树莓派3挂载硬盘)

    [前言] 本文将要讲解的功能为Linux环境下对磁盘进行操作.包括分区.格式化.挂载外接移动存储设备等. 该文的写作背景为本人的树莓派需要外接一个固态硬盘作为存储设备,因此,便开始了一系列的折腾. [ ...

  9. MongoDb 快速入门教程

    文章首发于[博客园-陈树义],点击跳转到原文MongoDb 快速入门教程. MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的 ...

  10. oracle分页,带有排序字段

    select detail_num,carriage_num,ed_date,created_date from (select rownum id,detail_num,carriage_num,e ...