我们知道当我们处理异常的时候,一个是声明,另外一个是捕捉。

捕捉:异常处理的捕捉方式,这是可以对异常进行针对性处理的方式。具体格式是:

 try
{ //需要被检测的异常 }
catch(异常类 变量)//类似于函数,变量用来接受发生异常的对象的(参数)
{ //处理异常的代码块 }
finally
{ //一定会被执行的代码 }

那么什么时候用捕捉,什么时候用声明呢?有的是把异常暴露出去,有的是不暴露异常。

我定义合理的功能,功能没有问题,你胡乱传入参数出现的异常,这个时候我就得把异常信息返回给你。如果建立功能的时候,自己能够处理得了,那么就自己处理,如果自己处理不了,那就直接抛出去。一个形象的例子:

我们楼内有灭火器,我们就建立了出现明火的预先处理。我们定义了处理方式,二十多年不出问题也没事。但是一旦出现问题,我们就建立灭火器这个预先处理方式。但是如果此时整个房子着了,这个时候即处理不了了,只能打电话给火警了。

放到try当中的东西是需要检查的不需要检查的就不用管了。catch原则,人家抛的什么问题,我们就针对这个问题处理。生活例子:比如说一个小感冒,自己就能够干好,干嘛非得去医院哇。所以,catch要有针对性的处理。

 class Demo
{ int[] arr = new int[]; void getValue(int num)
{ try
{ System.out.println(arr[num]);//这里可能出现异常,那么我们就在这个地方来检测 }
catch(IndexOutOfBoundsException e)//这里要有针对性的调用异常类型,进行处理
{ System.out.println("IndexOutOfBoundsException");//对异常进行处理后,程序继续往下进行 } } } class ExcepDemo2
{ public static void main(String[] args) { Demo d = new Demo();
d.getValue(); //如果这个地方出现异常的话,就会被getValue方法捕捉到,进而进行处理 } }

这里还有一种情况就是,在我们有多个catch的时候,也就是一个函数上声明了多个异常,这个时候在针对性处理的时候,我们就需要有多个catch对其进行处理。这里有个小细节需要注意一下:

 class Demo
{ void getValue(int[] arr,int num)
{ try
{ System.out.println(arr[num]); }
catch(IndexOutOfBoundsException e)
{ System.out.println("IndexOutOfBoundsException"); }
catch(NullPointerException e)
{ System.out.print("NullPointerException"); } } } class ExcepDemo2
{ public static void main(String[] args) { Demo d = new Demo();
int [] arr = new int[];
d.getValue(null,);
d.getValue(null,);
} }

如果处理多个catch的时候,出现了多个异常,只能捕捉一个。还有我们如果我们担心发生第三种异常的话,我们会增加一个异常处理,但是如果这个异常类是其他异常类的父类的话,一定要放到最下面。

即:

 class Demo
{ void getValue(int[] arr,int num)
{ try
{ System.out.println(arr[num]); }
catch(IndexOutOfBoundsException e)
{ System.out.println("IndexOutOfBoundsException"); }
catch(NullPointerException e)
{ System.out.print("NullPointerException"); }
/**
*这个地方Exception是IndexOutOfBoundsException 和 NullPointerException父类如果
*这个父类放到头部的话,那么出现的异常都被Exception捕捉了,那么下面的也就成了废
*话
*/
catch(Exception e)
{ System.out.println("Unokown Exception!"); } } }

如果把Exception这个放到头部的话,我们会编译失败提示:

异常处理的原则:

  异常就是问题。java已经提供给我们常见的描述,我们只需要拿过来用就可以了。描述这个对象,抛出就可以了。如果出现的问题,java没有给出指定的异常类描述,这个时候我们就需要自己来描述。那么try什么时候用呢?你只要使用了声明了异常的类方法,这个时候如果我们能够处理得了,这个时候就该用try。你只要没说,我就不处理,否则盲目的处理问题,只会在问题真正出现的时候,隐藏了要描述的异常。

  函数内部,如果抛出需要检测的异常,那么函数上必须要声明,否则必须在函数内用try..catch捕捉,否则编译失败。

  如果调用到了声明异常的函数,要么try...catch...要么throws,否则编译失败。

  什么时候catch?什么时候throws?

    功能内部可以解决用catch,解决不了用throws告诉调用者,由调用者来解决。

  一个功能抛出多个异常,那么调用时要用多个catch进行针对性的处理,有几个异常抛几个,抛几个异常,我们就catch几个。

java学习面向对象之异常之二的更多相关文章

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

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

  2. java学习笔记之OOP(二)

    java学习笔记二.面向对象[OOP]Object Oriented Programming 一.三大特性: 1.封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用 ...

  3. Java学习---面向对象的远程方法调用[RMI]

    基础知识 分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果. 常见的分 ...

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

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

  5. 我java学习时的模样(二)

    去掉自己浮躁的心 工作了三年,见识过高山,也见过低估,高山同大神一起共事,低估是几家特别烂的外包公司,现在有了另一种心境.已经开始重视自己,去掉当初浮躁的心. 毕业的一两年内,是人成长特别快的时期,也 ...

  6. #Java学习之路——基础阶段二(第五篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...

  7. java学习面向对象之接口

    上一节当中我们说道抽象类,抽象类当中的方法可以是抽象的也可以是非抽象的,那么当抽象类中所有方法都是抽象的时候,我们就可以把它重新定义为接口.代码示例: abstract class Animal { ...

  8. java学习面向对象之父子构造函数初始化

    在之前讲到java面向对象继承的时候,我们只讲到了两个比较重要的知识点,一个是父子类当中有同名的成员变量,这个时候,我们引入了super这个关键字来区分这两个同名成员变量,除此之外,我们还讲到了父子同 ...

  9. 201521123103 《java学习笔记》 第十二周学习总结

    一.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 二.书面作业 将Student对象(属性:int id, String name,int age,double ...

随机推荐

  1. SetUID、SetGID中的大小写Ss和Sticky bit中的大小写Tt

    大写:原文件/目录没有执行(x)权限 小写:原文件/目录有执行(x)权限 例如: 原文件:-rwxr-xr-x 增加SetUID后 4755 变为:-rwsr-xr-x 再如: 原文件:-rwxr-- ...

  2. 第一篇:web之前端之html

    前端之html   前端之html 本节内容 前端概述 html结构 标签探秘 <!DOCTYPE html>标签 head标签 body标签 1.前端概述 一个web服务的组成分为前端和 ...

  3. SharePoint SiteCollection Administrator

    到网上去找怎么取到一个站点的sitecollection  Administrator, 如果设置了一个站点的 sitecollection  Administrator, 那么通过: SPSite ...

  4. HDU-1009(简单贪心)

    FatMouse' Trade Problem Description FatMouse prepared M pounds of cat food, ready to trade with the ...

  5. git warning: LF will be replaced by CRLF in 解决办法

    在使用git的时候,每次执行 #git add "目录" git add . 都会提示这样一个警告消息: warning: LF will be replaced by CRLF  ...

  6. ( 转 )Github配置

    以下转自 http://liuzhijun.iteye.com/blog/1457207 有问题请联系我删除. -----———————————————————————— 如果你的代码不知道放哪里好, ...

  7. 一封给“X教授”的回信(讨论Socket通信)

    转载:http://www.cnblogs.com/tianzhiliang/archive/2011/03/02/1969187.html 前几天"X教授"发Email与我讨论S ...

  8. 触发器-Trigger

    --触发器的实例: Create Table Student(              --学生表         StudentID int primary key,       --学号     ...

  9. 检测SqlServer服务器IO是否瓶颈

    通过性能监视器监视 Avg. Disk Queue Length   小于2 Avg. Disk sec/Read , Avg. Disk sec/Write  小于10ms 可以用数据收集器定时收集 ...

  10. Object-C添加方法

    给实例变量添加getter方法: #import <Cocoa/Cocoa.h> @interface Photo:NSObject { NSString *caption; NSStri ...