java异常处理机制主要依赖于try,catch,finally,throw,throws五个关键字。
 
  try 关键字后紧跟一个花括号括起来的代码块,简称try块。同理:下面的也被称为相应的块。
 
  它里面可置引发异常的代码。catch后对应异常类型和一个代码块,用于表明catch块用于处理这种类型的代码块。后还可以跟一个finally块,finally块用于回收在try块里打开的物理资源,异常机制会保证finally块总被执行。throws关键字主要在方法签名中使用,用于声明该方法可能抛出的异常,而throw则用于抛出一个实际的异常,throw可以单独作为语句使用,抛出一个具体的异常的对象
  java异常处理可以让程序具有更好的容错性,程序更加健壮。当程序 出现意外情形时,系统会自动生成一个Exception对象来通知程序,从而实现将“业务功能实现代码”和“错误处理代码”分离,提供更好的可读性。
  如果执行try块里的业务逻辑代码时出现异常,系统自动会生成一个异常对象,该异常对象被提交给java运行环境,这个过程被称为抛出(throw)异常。当java运行环境收到异常对象时,会寻找处理该异常对象的catch块,如果找到合适的catch块并把该异常交给它处理,该过程被称为捕获异常;如果java运行环境找不到捕获异常的catch块,则运行环境终止,程序也将退出。
  使用finally回收物理资源
  当程序在try块里打开了的一些物理资源(数据库连接,网络连接及磁盘文件),这些物理资源必须显示回收。
  为了保证一定能够回收try块中打开的物理资源,异常处理机制提供了finally块,无论try块中的代码是否出现异常,也不管在哪个catch块中被执行,finally块总会被执行。异常处理结构语法中只有try块是必须的,一旦没有try块,则不能出现catch和finally块,如果存在try块,则catch块和finally块都是可选的。但二者至少要出现其一。也可以同时出现多个catch块。catch块必须位于try块后面,而finally必须位于catch块后面(如果存在的话);
  当java程序执行try块,catch块,时遇到了return语句或throw语句,这两个语句都会导致该方法的立即结束,但是系统并不会立即执行这两个语句,而是去寻找该异常处理流程中是否包含finally块,如果没有finally块程序立即执行return语句或throw语句,方法终止。反之,则系统会立即执行finally块——只有当finally块执行完后,系统才会再次跳回来执行try块,catch块里的return或throw语句,如果同时在 finally块中也存在return或throw语句,则finally块已经终止了方法,自然不存在系统再次跳转去执行try或catch块里的return或throw语句。
  使用throws声明抛出异常的思路是:当前方法不知道应该如何处理这种异常,该异常应该由上一级调用者处理,如果main方法也不知道如何处理这种异常类型。也可以使用throws声明抛出异常,把该异常交给javaJVM处理。
  JVM对异常的处理方法:打印异常跟踪栈信息,并终止程序运
 
runtime exception和checked exception
 
        Java提供了两类主要的异常:runtime exception和checked exception。所有的checked exception是从java.lang.Exception类衍生出来的,而runtime exception则是从java.lang.RuntimeException或java.lang.Error类衍生出来的。 

  它们的不同之处表现在两方面:机制上和逻辑上。

一、机制上 
  它们在机制上的不同表现在两点:1.如何定义方法;2. 如何处理抛出的异常。
 * Runtime exceptions:

  在定义方法时不需要声明会抛出runtime exception;

  在调用这个方法时不需要捕获这个runtime exception;

  runtime exception是从java.lang.RuntimeException或java.lang.Error类衍生出来的。

  * Checked exceptions:

  定义方法时必须声明所有可能会抛出的checked exception;

  在调用这个方法时,必须捕获它的checked exception,不然就得把它的exception传递下去;

  checked exception是从java.lang.Exception类衍生出来的。

二、逻辑上 
  从逻辑的角度来说,checked exceptions和runtime exception是有不同的使用目的的。checked exception用来指示一种调用方能够直接处理的异常情况。而runtime exception则用来指示一种调用方本身无法处理或恢复的程序错误。

  checked exception迫使你捕获它并处理这种异常情况。以java.net.URL类的构建器(constructor)为例,它的每一个构建器都会抛出MalformedURLException。MalformedURLException就是一种checked exception。设想一下,你有一个简单的程序,用来提示用户输入一个URL,然后通过这个URL去下载一个网页。如果用户输入的URL有错误,构建器就会抛出一个exception。既然这个exception是checked exception,你的程序就可以捕获它并正确处理:比如说提示用户重新输入。

总而言之,在程序的运行过程中一个checked exception被抛出的时候,只有能够适当处理这个异常的调用方才应该用try/catch来捕获它。而对于runtime exception,则不应当在程序中捕获它。如果你要捕获它的话,你就会冒这样一个风险:程序代码的错误(bug)被掩盖在运行当中无法被察觉。因为在程序测试过程中,系统打印出来的调用堆栈路径(StackTrace)往往使你更快找到并修改代码中的错误。有些程序员建议捕获runtime exception并纪录在log中,我反对这样做。这样做的坏处是你必须通过浏览log来找出问题,而用来测试程序的测试系统(比如Unit Test)却无法直接捕获问题并报告出来。
            针对 RuntimeException 类型的异常, javac 是无法通过编译时的静态语法检测来判断到底哪些函数(或哪些区域的代码)可能抛出这类异常(这完全取决于运行时状态,或者说运行态所决定的)理解为non_checked可以?,也正因为如此, Java 异常处理模型中的“ must be caught or declared to be thrown ”规则也不适用于 RuntimeException (所以才有前面所提到过的奇怪编译现象,这也属于特殊规则吧)。但是, Java 虚拟机却需要有效地捕获并处理此类异常。当然, RuntimeException 也可以被程序员显式地抛出,而且为了程序的可靠性,对一些可能出现“运行时异常( RuntimeException )”的代码区域,程序员最好能够及时地处理这些意外的异常,也即通过 catch(RuntimeExcetion) 或 catch(Exception) 来捕获它们。
    总结:
        所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception。error表示恢复不是不可能但很困难情况下的一种严重的问题。比如说内存溢出,不可能指望程序处理这样的情况,exception表示一种设计或实现问题,也就是说,它表示如果程序运行正常,从不会发生的情况。
                 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见的运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出为被捕获的运行时异常。

java的两种异常runtimeException和checkedException的更多相关文章

  1. Java中的两种异常类型及其区别?

    Java中的两种异常类型是什么?他们有什么区别? Throwable包含了错误(Error)和异常(Excetion两类) Exception又包含了运行时异常(RuntimeException, 又 ...

  2. java中两种类型变量

    Java中有两种类型的变量,一种是对象类型,另一种是基础类型(primitive type). 对象类型普遍采用引用的方式,比如 List a = new ArrayList(); List b = ...

  3. JAVA 中两种判断输入的是否是数字的方法__正则化_

    JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengz ...

  4. Java中两种实现多线程方式的对比分析

    本文转载自:http://www.linuxidc.com/Linux/2013-12/93690.htm#0-tsina-1-14812-397232819ff9a47a7b7e80a40613cf ...

  5. Java中有两种实现多线程的方式以及两种方式之间的区别

    看到一个面试题.问两种实现多线程的方法.没事去网上找了找答案. 网上流传很广的是一个网上售票系统讲解.转发过来.已经不知道原文到底是出自哪里了. Java中有两种实现多线程的方式.一是直接继承Thre ...

  6. JavaScript 与 Java 是两种完全不同的语言,无论在概念还是设计上。

    JavaScript 与 Java 是两种完全不同的语言,无论在概念还是设计上. Java(由 Sun 发明)是更复杂的编程语言. ECMA-262 是 JavaScript 标准的官方名称. Jav ...

  7. 两种异常(CPU异常、用户模拟异常)的收集

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 两种异常(CPU异常.用户模拟异常)的收集  文章的核心:异常收集 ...

  8. Java中的两种异常类型是什么?他们有什么区别?

    一.Throwable是所有异常的根,java.lang.Throwable Error是错误,java.lang.Error Exception是异常,java.lang.Exception 二.E ...

  9. Java异常处理机制及两种异常的区别

    java异常处理机制主要依赖于try,catch,finally,throw,throws五个关键字.   try 关键字后紧跟一个花括号括起来的代码块,简称try块.同理:下面的也被称为相应的块. ...

随机推荐

  1. 关于c++中方法名前面的双冒号

    #include "iostream" using namespace std; template <typename T> void swap(T &a, T ...

  2. <pre>标记的使用...

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. WTL版本ACEdit控件,改写自MFC版,附带源码

    自动完成是个很酷也很实用的功能,比如在浏览器地址栏输入几个字母,相关的记录就会在下拉框中陈列出来. 最近在做公司产品UI部分的改善,原版本是MFC做的,我决定用WTL,于是就遇到自动完成控件的问题.遍 ...

  4. python 列表、字典的方法

    # 列表最后新增元素 li = [11, 22, 33] print(li) li.append(44) # 对原列表最后增加一个元素 print(li) 执行如下: [11, 22, 33][11, ...

  5. 第二次冲刺spring会议(第五次会议)

    [例会时间]2014/5/8 21:15 [例会地点]9#446 [例会形式]轮流发言 [例会主持]马翔 [例会记录]兰梦 小组成员:兰梦 ,马翔,李金吉,赵天,胡佳奇

  6. 2.定义图形类Shape,该类中有获得面积的方法getArea();定义长方形类Rect,该类是Shape的子类,类中有矩形长和宽的变量double a,double b,设置长和宽的方法setWidth()、setHeight(),使用getArea()求矩形面积;利用getArea方法实现题1中圆面积的求解。

    // 图形类Shape package d922B; public class Shape { double getArea(ShapePara x){ return x.getArea(); } d ...

  7. Python 常见的内置模块

    datetime datetime是python处理日期和时间的标准库 获取当前日期和时间 我们先看看如何获取当前的日期和时间: >>> from datetime import d ...

  8. Core Animation中的组动画

    实际开发中一个物体的运动往往是复合运动,单一属性的运动情况比较少,但恰恰属性动画每次进行动画设置时一次只能设置一个属性进行动画控制(不管是 基础动画还是关键帧动画都是如此),这样一来要做一个复合运动的 ...

  9. BITMAP图片压缩算法三则--bilinear、nearest、cubic

    原文:http://blog.chinaunix.net/uid-253932-id-3037805.html 工作需要,要弄截图且缩小.截图倒是好说,WIN API可以搞定,但是缩小且尽量不失真,这 ...

  10. play框架概述

    今天是来百度实习的第四天,在项目过程中mentor说会用到play框架,当时就一个晕啊.Java还有一个叫play框架,作为一个从大三开始用java的重度javaer,居然不知道这个框架的存在,内心一 ...