异常处理机制

异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被卡死,处于一直等待,或死循环。

异常有两个过程,一个是抛出异常;一个是捕捉异常。

抛出异常

抛出异常有三种形式,一是throw,一个throws,还有一种系统自动抛异常。下面它们之间的异同。

系统自动抛异常

当程序语句出现一些逻辑错误、主义错误或类型转换错误时,系统会自动抛出异常。如:

 public static void main(String[] args) {
int a = 5, b =0;
System.out.println(5/b);
//function();
}

系统会自动抛出ArithmeticException异常:

Exception in thread "main" java.lang.ArithmeticException: / by zero

at test.ExceptionTest.main(ExceptionTest.java:62)

再如

 public static void main(String[] args) {
String s = "abc";
System.out.println(Double.parseDouble(s));
//function();
}

系统会自动抛出NumberFormatException异常:

Exception in thread "main" java.lang.NumberFormatException: For input string: "abc"

at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224)

at java.lang.Double.parseDouble(Double.java:510)

at test.ExceptionTest.main(ExceptionTest.java:62)

throw

throw是语句抛出一个异常。
语法:throw (异常对象);
      如:  throw e;

一般会用于程序出现某种逻辑时程序员主动抛出某种特定类型的异常。如:

 public static void main(String[] args) {
String s = "abc";
if(s.equals("abc")) {
throw new NumberFormatException();
} else {
System.out.println(s);
}
//function();
}

会抛出异常:

Exception in thread "main" java.lang.NumberFormatException

at test.ExceptionTest.main(ExceptionTest.java:67)

throws

throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)
语法:[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{......}
      如:      public void function() throws Exception{......}

当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常,然后交给上层调用它的方法程序处理。如:

 public static void function() throws NumberFormatException{
String s = "abc";
System.out.println(Double.parseDouble(s));
} public static void main(String[] args) {
try {
function();
} catch (NumberFormatException e) {
System.err.println("非数据类型不能转换。");
//e.printStackTrace();
}
}

处理结果如下:

非数据类型不能转换。

throw与throws的比较

1、throws出现在方法函数头;而throw出现在函数体。

2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。

3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

好的编程习惯:

1.在写程序时,对可能会出现异常的部分通常要用try{...}catch{...}去捕捉它并对它进行处理;

2.用try{...}catch{...}捕捉了异常之后一定要对在catch{...}中对其进行处理,那怕是最简单的一句输出语句,或栈输入e.printStackTrace();

3.如果是捕捉IO输入输出流中的异常,一定要在try{...}catch{...}后加finally{...}把输入输出流关闭;

4.如果在函数体内用throw抛出了某种异常,最好要在函数名中加throws抛异常声明,然后交给调用它的上层函数进行处理。

捕捉异常

先讲捕捉异常

 try{
 ……
}catch(Exception e){
 ……
}finally{
 ……
}

try{……}中放置可能会发生异常的的语句块,如可能出现异常的函数,也可以是一般的程序语句;catch(){……}用于抓住异常,(Exception e)中Exception是异常的类型,必须是Exception(Exception是所有异常类的父类)的子类。{}定义当出现异常时的处理方法。finally{……}表示不管异常是否发生,都得进行finally{}中的处理。

在捕捉异常的try{...}语句块中,如果出现了异常,则该语句(出现异常的语句)后的程序语句都不执行,而是跳到catch{...}语句块中执行异常的处理。如:

 public static void function1() throws NumberFormatException{
System.out.println(Double.parseDouble("abc"));
System.out.println("第二条语句。"); } public static void main(String[] args) {
try {
function1();
} catch (Exception e) {
System.err.println(e.getMessage());
//e.printStackTrace();
}
}

结果如下,只输出了一条错误提示语:

For input string: "abc"

System.out.println("第二条语句。");未执行。

如果一个函数没有用throws进行抛异常,在调用该函数的方法也同样可以捕捉异常。如

 public static void function() {
String s = "abc";
System.out.println(Double.parseDouble(s));
} public static void main(String[] args) {
try {
function();
} catch (Exception e) {
System.err.println("非数据类型不能转换。");
//e.printStackTrace();
}
}

处理结果如下:

非数据类型不能转换。

说明:某个函数或某段程序块不管会不会,有没可能抛出异常,都可以加try{...}catch{...}去捕捉它。

自定义异常

用户可以自定义异常,新建一个异常类,让其继承Exception类或Exception的某个子类。然后用throw抛出自己定义的异常类对象。如:

 public static void function() throws ParenthesisMatchingException{
String s = "((a+b)";
ParenthesisMatchingException e = new ParenthesisMatchingException("括号匹配异常!");
if(s.charAt(0)=='(' && s.charAt(1)=='(') {
throw e;
}
System.out.println(s);
} public static void main(String[] args) {
try {
function();
} catch (Exception e) {
System.out.println(e.getMessage());
//e.printStackTrace();
}
}

结果如下 :

  括号匹配异常!

【Java学习笔记之三十二】浅谈Java中throw与throws的用法及异常抛出处理机制剖析的更多相关文章

  1. 【Java学习笔记之三十】详解Java单例(Singleton)模式

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  2. Java学习笔记(十二):java编译跨平台运行原理

    class文件由java源代码通过javac编译器编译生成,只能为JVM所识别.

  3. 【Java学习笔记之三十三】详解Java中try,catch,finally的用法及分析

    这一篇我们将会介绍java中try,catch,finally的用法 以下先给出try,catch用法: try { //需要被检测的异常代码 } catch(Exception e) { //异常处 ...

  4. 【Java学习笔记之三十四】超详解Java多线程基础

    前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...

  5. Java学习笔记【十二、网络编程】

    原计划的学习结束时间是3月4日,目前看来已经延迟了,距离低标还差一些,多方面原因,也不找借口,利用周末赶赶进度,争取本周末把低标完成吧! 参考: http://www.runoob.com/java/ ...

  6. 【Java学习笔记之十二】Java8增强的工具类:Arrays的用法整理总结

    本文将整理 java.util.Arrays 工具类比较常用的方法:  本文介绍的方法基于JDK 1.7 之上.  1.  asList方法 @SafeVarargs public static &l ...

  7. Java学习笔记(十二)——eclipse和SVN配置,导入SVN服务器项目

    [前面的话] 北京的天气外加自己的不小心终于病了,在病的过程中,感觉身体好着真好,可以学习,可以吃好吃的,可以去运动,这一病了,干什么都感觉没有力气,身体好着真好. 这个文章的背景是:领导把项目最开始 ...

  8. shell编程学习笔记(十二):Shell中的break/continue跳出循环

    在循环遍历中,可以添加对应判断条件跳出循环,跳出循环可以使用break/continue,这个跟java语言是一样的,break是指跳出整个循环,continue是指跳出当前循环体,继续下一项循环. ...

  9. Java学习笔记(十四):java常用的包

随机推荐

  1. (转)添加eclipse、MyEclipse、Spring Tool Suite的反编译插件

    很多兄弟为在IDE里看不到源代码类而不得不下一个反编译工具,但是这样会降低代码效率,如果能直接在IDE里看,何乐而不为呢!现在我整理了一下网上很多兄弟的设置反编译的经验. 可分为下面几步. 1 下载J ...

  2. 导航栏使用UIButton自定义返回按钮的图片

    - (void)viewDidLoad { UIButton *backItem = [UIButton buttonWithType:UIButtonTypeCustom]; UIBarButton ...

  3. Object-C 里面的animation动画效果,核心动画

    #import "CoreAnimationViewController.h" @interface CoreAnimationViewController ()@property ...

  4. VMware workstation批量创建虚拟机和自动化安装操作系统(一)

    一. 简述 作为从事IT行业运维工作的Linuxer,大多情况下需要在测试环境中部署业务系统并进行测试,在没有足够的计算存储网络条件下,使用虚拟机进行虚拟集群的创建和使用,是一种不错的学习和实践方式. ...

  5. webIDE 第二篇博文

    这是我做webIDE过程中的第二篇博文,之所以隔了这么长时间没更,因为确实是没有啥进度啊,没什么可写的,现在虽然依然没啥进度,但中途遇到很多坑,这些坑还是有记录下来的必要的. 因个人水平问题,可能有的 ...

  6. centos 7 下面安装oracle 11g r2 过程分享

    本人对LINUX等很多还不熟悉,如果有不对的地方还请各位指正.谢谢. 打算学习下ORACLE,RMAN备份与还原功能,所以安装了虚拟机,用的是centos7 X86_64-1611版本,oracle用 ...

  7. 文科生细谈学习Linux系统的重要性

    首先大概介绍下自己,我学的是公共事业管理方面的专业,可以说是面向纯理论,社区管理社会管理的专业,但是从大二开始,对网络及服务器运维方面产生浓厚兴趣,并不断在网上找相关资料. 在这期间经历过很多,单说桌 ...

  8. Java 字符串截取问题

    编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如"我ABC"4 public class StringSplit  ...

  9. python-插入排序

    所谓插入排序,就是检查第i个数字,若比它的左边的数字小,则进行交换,一直持续这个动作,直到它的左边的数字比它还要小,则停止. #coding:utf-8def insertion_sort(nums) ...

  10. React Native 系列(一) -- JS入门知识

    前言 本系列是基于React Native版本号0.44.3写的,最初学习React Native的时候,完全没有接触过React和JS,本文的目的是为了给那些JS和React小白提供一个快速入门,让 ...