异常:程序在运行过程中发生由于硬件设备问题、软件设计错误等导致的程序异常事件。
世上没有百分之百完美的程序。程序总难免存在各式各样的问题。所以,程序中添加对于错误的处理机制是十分有必要的。这就好比人多的公共场所需要有防火防盗的安保系统一个道理。

捕获异常

异常处理格式

try {

    // 有可能出现异常的语句

} catch (Type1 e1) {

    // 异常类型1处理代码

} catch (Type2 e2) {

    // 异常类型2处理代码

} 

// etc...

catch (TypeN en) {

    // 异常类型n处理代码

} finally {

    // 不管有没有发生异常,finally语句块都会被执行

    // 在 try...catch 异常处理机制中, finally关键字是可选的

}

try 关键字之后的程序块就是异常的监控区域

多个 catch 关键字后面的程序块,则是针对每个要捕获的异常,所准备的相应处理程序。

finally 关键字之后的程序块,无论是否出现异常,总会被执行。 finally 关键字在 try...catch 机制中并不是必须的。

public class ExceptionDemo02 {
    public static void main(String args[]) {
        System.out.println("********** 计算开始 ***********");
        int i = 10;
        int j = 0;
        try {
            int temp = i / j; // 此处产生了异常
            System.out.println("两个数字相除的结果:" + temp);
            System.out.println("****************************");
        } catch (ArithmeticException e) {
            System.out.println("出现异常了:" + e);
        } finally {
            System.out.println("对与不对,我都在这里,不偏不移");
        }        
        System.out.println("********** 计算结束 ***********");
    }
};

范例代码

自定义异常

JAVA虽然提供了大量的异常类,但也不可能预见所有的异常情况。所以可以自己定义异常类来表示程序可能会遇到的特定问题。

要自定义异常类,必须从已有的异常类继承,最好选择功能相近的异常类继承。

// 自定义异常类,继承Exception类

class MyException extends Exception {

    public MyException(String msg) {

        super(msg); // 调用Exception类中有一个参数的构造方法,传递错误信息

    }

};

public class DefaultException {

    public static void main(String args[]) {

        try {

            throw new MyException("自定义异常。"); // 抛出异常

        } catch (Exception e) {

            e.printStackTrace();

        }

    } /* Output:

MyException: 自定义异常。

    at DefaultException.main(DefaultException.java:11)

    */

}

抛出异常

在定义一个方法时可以使用 throws 关键字声明,使用 throws 声明的方法表示此方法不处理异常,而交给方法的调用处进行处理。

public 返回值类型 方法名称(参数列表...) throws  异常类{}

需要注意的是,如果异常类类型不是运行时异常类型,那么在调用这个方法时,不管是否有问题,都必须使用 try...catch 进行异常的捕获与处理。

class Div {
    // 定义除法操作,如果有异常,则交给被调用处处理
    public int div(int i, int j) throws Exception {
        int temp = i / j;
        return temp;
    }
};

public class ThrowsDemo01 {
    public static void main(String args[]) {
        Div div = new Div();
        // div.div(10, 0); // 如果不使用 try...catch 结构,编译器会认为出错
        try {
            System.out.println("除法操作:" + div.div(10, 0));
        } catch (Exception e) {
            e.printStackTrace(); // 打印异常
        }
    }
};

范例代码

throws 不同,throw 关键字表示主动地抛出一个异常,抛出时直接抛出异常类的实例化对象即可。

public class ThrowDemo01{
    public static void main(String args[]){
        try{
            throw new Exception("自己抛着玩的。") ;    // 抛出异常的实例化对象
        }catch(Exception e){
            System.out.println(e) ;
        }
    }
};

范例代码

异常的类型

JAVA中所有的异常类都继承自 Throwable 类。

异常可分为两大类:Exception 和 Error。

Exception:一般指的是程序中出现的问题,可以通过 try...catch 处理。

Error:一般指的是JVM错误,程序无法处理。

Exception还可以再继续细分为运行时异常(RuntimeException)非运行时异常

运行时异常可以不使用 try...catch 进行处理。

非运行时异常必须使用 try...catch 进行处理。

请看以下代码:

public class RuntimeExceptionDemo01 {

    public static void main(String args[]) {

        int result = 0;

        String str = "10";

        String str2 = "abc";

        result = Integer.parseInt(str); // 将字符串中的数字转为int类型

        System.out.println(result * result);

        result = Integer.parseInt(str2); // 试图将字符串中字母转为int类型时会出现异常

        System.out.println(result * result);

    }

};

执行以上代码时,再第二次调用Integer.parseIn()时会出现异常。我们看一下这个方法的定义:

public static int parseInt(String s) throws NumberFormatException

这里使用了 throws 关键字,但是在实际调用时并没有使用 try...catch,编译器也没有报错。

这是因为所有继承自 RuntimeException 的类都可以不使用 try...catch 进行处理。在这种情况下,如果产生异常,将由 JVM 进行处理,此时肯定会中断程序。

所以,如果想要程序在出错时仍可以继续执行,最好还是使用 try...catch 的异常处理机制来处理。

参考资料

Java 编程思想

JAVA 开发实战宝典

[Java 进阶]异常的更多相关文章

  1. 当我们说线程安全时,到底在说什么——Java进阶系列(二)

    原创文章,同步发自作者个人博客,转载请以超链接形式在文章开头处注明出处http://www.jasongj.com/java/thread_safe/ 多线程编程中的三个核心概念 原子性 这一点,跟数 ...

  2. Java进阶03 IO基础

    链接地址:http://www.cnblogs.com/vamei/archive/2013/04/11/3000905.html 作者:Vamei 出处:http://www.cnblogs.com ...

  3. 从ConcurrentHashMap的演进看Java多线程核心技术 Java进阶(六)

    本文分析了HashMap的实现原理,以及resize可能引起死循环和Fast-fail等线程不安全行为.同时结合源码从数据结构,寻址方式,同步方式,计算size等角度分析了JDK 1.7和JDK 1. ...

  4. Java进阶(四十七)Socket通信

    Java进阶(四十七)Socket通信   今天讲解一个 Hello Word 级别的 Java Socket 通信的例子.具体通讯过程如下: 先启动Server端,进入一个死循环以便一直监听某端口是 ...

  5. Java进阶(四十三)线程与进程的区别

    Java进阶(四十三)线程与进程的区别 1.线程的基本概念   概念:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必 ...

  6. JAVA进阶之旅(二)——认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践

    JAVA进阶之旅(二)--认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践 我们继续聊JAVA,这次比较有意思,那就是反射了 一.认识 ...

  7. Java进阶之路

    Java进阶之路——从初级程序员到架构师,从小工到专家. 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序 ...

  8. Java 进阶6 异常处理的陷阱

    Java 进阶6 异常处理的陷阱 20131113 异常处理机制是 Java语言的特色之一,尤其是 Java的Checked 异常,更是体现了 Java语言的严谨性:没有完善的错误的代码根本就不会被执 ...

  9. Java进阶2 数组内存和对象的内存管理知识

    Java进阶2 数组内存和对象的内存管理知识 20131028 前言: 在面试的时候,如果是Java的编程语言,也许你认为没有什么可以问的,只能够说明你对于Java了解的太浅了,几乎就是两个星期的节奏 ...

随机推荐

  1. spark on centos6.5 安装

    第一步在centos 6.5上安装java 运行环境 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-18 ...

  2. Android Scroll分析——滑动效果产生

    相对于在Android2.x版本上出现的长按.点击事件的效果,不得不说,滑动操作具有更好的用户体验.因此,从Android 4.X版本开始,出现了更多滑动操作的效果.越来越多第三方应用模仿这样的效果, ...

  3. Viewbox在UWP开发中的应用

    Windows 8.1 与Windows Phone 8.1的UAP应用,终于在Windows 10上统一到了UWP之下.原来3个不同的project也变为一个.没有了2套xaml页面,我们需要用同一 ...

  4. 设计模式之美:Null Object(空对象)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Null Object 的示例实现. 意图 通过对缺失对象的封装,以提供默认无任何行为的对象替代品. Encapsulate t ...

  5. Android setTag方法的key问题

    android在设计View类时,为了能储存一些辅助信息,设计一个一个setTag/getTag的方法.这让我想起在Winform设计中每个Control同样存在一个Tag. 今天要说的是我最近学习a ...

  6. Web前端技术研究:Css hack技术---令人沮丧的技术

    我最近想好好整理下csshack技术,但是结果很沮丧,下面我将我最初写的笔记和大家分享下. 我在单位整理的研究笔记: 不同的浏览器对某些CSS代码解析会存在一定的差异,因此就会导致不同浏览器下给用户展 ...

  7. mac 命令行批量删除.svn[转]

    mac下.svn是隐藏文件,而且即使我们调成可见的,一个一个删也很麻烦.今天正好同事问起来这个命令,于是想可能有些人也需要,于是还是放到博客里吧 命令比较简单,其实就是一条linux命令,打开终端,首 ...

  8. C#开源磁盘/内存缓存引擎

    前言 昨天写了个 <基于STSdb和fastJson的磁盘/内存缓存>,大家可以先看看.下午用到业务系统时候,觉得可以改进一下,昨晚想了一个晚上,刚才重新实现一下. 更新 1. 增加了对批 ...

  9. NanoProfiler - 适合生产环境的性能监控类库 之 实践ELK篇

    上期回顾 上一期:NanoProfiler - 适合生产环境的性能监控类库 之 大数据篇 上次介绍了NanoProfiler的大数据分析理念,一晃已经时隔一年多了,真是罪过! 有朋友问到何时开源的问题 ...

  10. Java-数组练习4

    16.按要求编写Java应用程序.编写一个名为Test的主类,类中只有一个主方法: 在主方法中定义一个大小为50的一维整型数组,数组名为x,数组中存放着{1, 3,5,…,99}输出这个数组中的所有元 ...