异常(Exception)

一、什么是异常?

异常就是程序中的错误,比如数组越界、访问空指针等。在Java中,一切皆对象,异常也不例外。所有的异常都是派生于Throwable类的一个实例对象。

二、异常的分类

在异常界,有两大流派。一派叫Error类,另一派叫Exception类,它们都继承自Throwable类。在Exception类下还有两大分支,IOException类和RuntimeException类。

RuntimeException是由程序本身的错误导致的异常。

IOException是程序本身没有问题,但是因为IO发生的错误引起的异常。

举例:

RuntimeException(unchecked)

IOException(checked)

数组访问越界

试图打开一个不存在的文件

访问空指针

试图在文件尾部读取数据

错误的类型转换

RuntimeException类和它的叔叔Error类比较亲,叔侄俩统称为未检查异常(unchecked Exception),大白话就是不用你检查,不用你管的异常。而IOException和它的兄弟和叔叔明显不是一路的,被称为已检查异常(checked Exception),就是你得管它。

三、异常处理(Exception handing)

前面说过未检查异常不用我们管,所以这里就只说我们怎么对付已检查异常。

(1)throws

 首先,你得声明它。方法应该在其首部用throws+异常名声明所有可能抛出的异常。

  抛出异常的4中情形:

  1.调用一个抛出已检查异常的方法。

  2.程序运行过程中发现错误,并且利用throws语句抛出已检查异常

  3.程序出现错误,比如数组访问越界,会自动抛出ArrayIndexOutOfBoundsException

  4.Java虚拟机和运行时库出现的内部错误

  举个例子:

 Class MyAnimation{
     public Image LoadImage(String s)throws IOException, EOFException
     {
     ......
     }
 }

(2)用throw关键字抛出异常

 String readData(Scanner in)throws EOFException{
     ...
     while(...){
         if(!in.hasNext())
         {
             if(n<len)
             throw new EOFException();
         }
     }
 }        

(3)自定义异常

当java提供的异常满足不了需要的时候,可以自己DIY一个

 //定义一个FileFormatException类
 class FileFormatException extends IOException{
     public FileFormatException(){}
     public FileFormatException(String gripe){
         super(gripe);
     }
 }
 //下面抛出自定义异常
 String readData(Scanner in)throws EOFException
 {
     ...
     while(...){
         if(ch == -1){
             if(n<len)
             throw new FileFormatException();
         }
     }
     return s;
 }    

(4)捕获异常

光把异常抛出去,不能不管啊,所以就得捕获它并处理它。

 //利用try-catch语句块捕获异常
 try{
     code
 }
 catch(ExceptionType e){
     handler for this type
 }

  如果在try语句块中的代码抛出了一个在catch子句中说明的异常类,那么

  1)程序将跳过try语句块的其他代码。

  2)程序将执行catch子句中的处理器代码

(5)异常-方法内外

  对于异常,可以在方法内部用try-catch语句块来捕获并处理,如果不想在方法内处理,可以在方法首部声明可能抛出的异常,将异常可能抛出的异常交给调用方法的代码去处理。总之,就是方法内用try-catch处理,方法外用throws抛出。

(6)捕获多个异常

 try{
     code
 }
 catch(FileNotFoundException | UnknowHostException e){
     ...
 }
 catch(IOException e){
     ...
 }

(7)finally

 try{
     ...
 }
 catch(IOException e){
     ...
 }
 finally{
     ...
 }

不管有没有异常发生,finally语句块中的代码都将执行。

try-catch、try-catch-finally、try-finally三种组合,1、3组合更常用

(8)带资源的try语句块

带资源的try块在退出时,会自动关闭资源,这样往往就可以省掉finally语句

 try(Scanner in = new Scanner(new FileInputStream(“文件路径”))){
     while(in.hasNext())
     System.out.println(in.next());
 }

注:╮(╯▽╰)╭本文大量参考《Java核心技术 卷I》

Java学习日记9-异常的更多相关文章

  1. Java学习日记基础篇(九) —— 集合框架,泛型,异常

    集合框架 有事我们会需要一个能够动态的调整大小的数组,比如说要添加新员工但是数组已经满了,并且数组的大小是在定义的时候定死的,所以我们就需要一个能够动态调整大小的数组或者用链表解决,而java中提供了 ...

  2. 1.13(java学习笔记)异常机制

    异常不同于错误,它是程序运行时产生的未知问题. 如果把程序比喻成一辆汽车,那么汽车开着开着突然前面出现了一个大石头挡住了路,这就叫异常. 那么出现了这个异常我们需要去处理,比如打电话给公路管理局,让它 ...

  3. Java学习日记基础(五)——类、对象之this、静态变量(类变量)、静态方法(类方法)、四大特征

    this 赵本山问奥尼尔:“我的爸爸的爸爸是谁?” 奥尼尔:“不知道” 赵本山:“你傻啊,是我爷爷” 奥尼尔回去问科比:“我的爸爸的爸爸是谁?” 科比:“不知道” 奥尼尔:”你傻啊,是赵本山的爷爷“ ...

  4. Java学习日记之 Java-其他类型

    OK , 就绪, 第一篇博客开撸 ~ 先听了毕姥爷激情澎湃的其他类型 ,从这里开始入手吧 : (一)System类  System类代表系统类,系统的属性和方法都放在该类.System类是一个fina ...

  5. java学习面向对象之异常之二

    我们知道当我们处理异常的时候,一个是声明,另外一个是捕捉. 捕捉:异常处理的捕捉方式,这是可以对异常进行针对性处理的方式.具体格式是: try { //需要被检测的异常 } catch(异常类 变量) ...

  6. java学习面向对象之异常之一

    一.异常的概述: 什么是异常?在我们编写java程序的时候,会出现一些问题,比如内存溢出啊或者数组索引超出最大索引啊,这些编程当中出现的这些个问题就是异常.但是异常也分为可以处理的和不可以处理的.比如 ...

  7. Java学习日记-2.5 关于0和无穷

    1. 无穷 Java中将无穷定义为浮点数,分为正负无穷,分别为POSITIVE_INFINITY和NEGATIVE_INFINITY 2. null null在java中可以理解为一个特殊的引用类型, ...

  8. Java学习日记-11 集合(1)

    Collection接口集合中存储的只是对象的引用,不是对象本身. 1.ArrayList<E>类1.1ArrayList和Collection的关系 public interface L ...

  9. Java学习日记-2 零零碎碎

    一.使用Scanner类进行控制台的输入 文档中Scanner类的定义为A simple text scanner which can parse primitive types and string ...

随机推荐

  1. codevs 1997 守卫者的挑战

    /* 表示很遗憾.. 开始状态想的没错 就是转移的时候出了问题 自己也想到了数组平移 然而没往下写 与正解擦肩而过…. 然后为了好转移写了个4维的 时间不多了没来得及降维 草草的算算空间就交了… 尼玛 ...

  2. C#中的占位符

    当我们需要在屏幕上输出一句话的时候,如果不断的使用+来连接各个字符串,一是容易出错,二是代码显示的非常乱.这时候,占位符就能够发挥作用! 占位符: string name="张三" ...

  3. CSS控制表单

    一个简单的网站注册页面制作. 创建CSS文件如下: @charset "utf-8"; /* CSS Document */ * { margin: 0px; padding: 0 ...

  4. editplus双击单词语法高亮显示设置

    view=>Word Highlighting

  5. 使用WMI来连接远端计算机

    1. wmi连接前提 利用wmi来连接远端计算机首先要具有远端计算机管理员的用户名和密码.如果计算机在域中的话,要有域管理员用户名和密码,或者是把域帐户加入本机管理员组中也可以. 2. 相关类的用法- ...

  6. Dedecms当前位置{dede:field name='position'/}修改

    这个实在list_article.htm模板出现的,而这个模板通过loadtemplage等等一系列操作是调用的include 下的arc.archives.class.php $this->F ...

  7. SQL Server附加数据库拒绝访问

    打开要附加的数据库文件所在的文件夹,即扩展名为mdf的文件所在的文件夹,如下图所示:   右键单击mdf文件,选择“属性”,如下图所示:   单击“安全”选项卡,如下图所示:   单击“编辑”按钮,如 ...

  8. 基于Jquery easyui 选中特定的tab并更新

    获取选中的 Tab // 获取选中的 tab panel 和它的 tab 对象 var pp = $('#tt').tabs('getSelected'); var tab = pp.panel('o ...

  9. POJ 2230 (欧拉路)

    分析: 基础的欧拉路算法,变化在于要求每条边正向和反向各走一遍. 链式前向星构图,只要标记走过的单向边,边找边输出即可. code #include <iostream> #include ...

  10. PHP搜索Solr文档(含高亮)

    <?php $options = array ( 'hostname' => 'localhost', 'port' => '8080', 'path' => 'solr/he ...