转自:http://www.cnblogs.com/Miracle-Maker/p/6239346.html

浅谈Java异常

以前虽然知道一些异常的处理,也用过一些,但是对throw和throws区别还是有不太清楚。今天用实例测试一下

异常处理机制

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

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

抛出异常

抛出异常有三种形式,一是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)

  再如:

 

系统会自动抛出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抛出自己定义的异常类对象。

在进行程序开发的过程中,自定义异常遵循以下四个步骤:

  1)首先创建自定义异常类,语法格式:自定义异常类名 extends Exception。

  2)在方法中通过关键字throw抛出异常对象。

  3)若是在当前抛出异常的方法中处理异常,可以用try-catch语句捕获并处理;若不是,在方法的声明处通过关键字throws指明要抛出给方法调用的异常。

4)在出现异常方法的调用中捕获并处理异常

如:

 package packageone;

 //自定义异常类
class MyException extends Exception{
public MyException(String s){
super(s);
}
} /*
* 设计类Number,类中有除法计算方法。使用自定义异常类
*/
class Number{
public int divition(int num1,int num2) throws MyException {
if (0==num2) {
throw new MyException("分母不能为零!");
}
return (num1/num2);
}
}
//测试自定义异常类
public class ExceptionTest{
public static void main(String[] args) {
Number n = new Number();
try {
System.out.println("自定义两个数的商的结果为:"+n.divition(12, 0));
} catch (MyException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}

处理结果如下:

 
分母不能为零!

packageone.MyException: 分母不能为零!

at packageone.Number.divition(ExceptionTest.java:16)

at packageone.ExceptionTest.main(ExceptionTest.java:26)

Java-通过比较throw与throws来阐述抛出异常的更多相关文章

  1. Java中的throw和throws的差别

    Java中的throw和throws的差别 1.throwkeyword用于方法体内部.而throwskeyword用于方法体部的方法声明部分: 2.throw用来抛出一个Throwable类型的异常 ...

  2. Java中的throw和throws的区别

    Java中的throw和throws的区别 1.throw关键字用于方法体内部,而throws关键字用于方法体部的方法声明部分: 2.throw用来抛出一个Throwable类型的异常,而throws ...

  3. java中的throw、throws和try catch浅析

    今天在公司和同事聊天的时候,突然发现自己对java中的throw.throws和try catch的作用理解不够准确,在网上查了查,在此大概梳理一下. throw用于抛出异常,例如 throw new ...

  4. java中的throw与throws的区别

    什么时运行时异常?什么是非运行时异常? 通俗的讲: 运行时异常:就是编译通过,运行时就崩了,比如数组越界. 非运行时异常:就是编译不通过,这时就得必须去处理了.不然就没法运行了. 全面的讲: Thro ...

  5. Java基础系列--throw、throws关键字

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8484697.html 一.概述 throw和throws就是异常相关的关键字,在java中 ...

  6. Java中关键字throw和throws的区别

    ==========================================题外话===================================================== 今 ...

  7. java异常和throw和throws的区别

    之前在编程中编译完成后,运行时,会遇见一些常见的错误,如NullPointerException,ArrayIndexOutOfBoundsException等等 在今天重新回顾学习了java异常,总 ...

  8. Java 中,throw 和 throws 有什么区别?

    throw 用于抛出 java.lang.Throwable 类的一个实例化对象,意思是说你可以通 过关键字 throw 抛出一个 Error 或者 一个 Exception,如:throw new ...

  9. java异常中throw和throws的区别

    throws和throwthrows:用来声明一个方法可能产生的所有异常,不做任何处理而是将异常往上传,谁调用我我就抛给谁.  用在方法声明后面,跟的是异常类名  可以跟多个异常类名,用逗号隔开  表 ...

随机推荐

  1. hadoop 1.x 集群环境的搭建

    本文主要以个人工作学习总结为主,同时也为了方便更多的兴趣爱好者参与学习交流,现将具体的搭建步骤分享如下: 一.基础环境 1.1 jdk的安装与配置 Hadoop是用Java开发的,Hadoop的编译及 ...

  2. Java8 Lambda表达式实战之方法引用(一)

    方法的引用 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法,方法引用提供了一种引用而不执行方法的方式,如果抽象方法的实现恰好可以使用调用另外一个方法来实现,就有可能可以使用方法引用 方法 ...

  3. Nodejs实战 —— 测试 Node 程序

    读 <node.js实战2.0>,进行学习记录总结. 当当网购买链接 豆瓣网1.0链接 测试 Node 程序 本章内容 用 Node 的 assert 模块测试 使用其他断言库 使用 No ...

  4. struts2学习笔记四

    一.contextMap中的数据操作 root根:List 元素1 元素2 元素3 元素4 元素5 contextMap:Map key value application Map key value ...

  5. MongoDB入门---文档查询操作之条件查询&and查询&or查询

    经过前几天的学习之路,今天终于到了重头戏了.那就是文档查询操作.话不多说哈,直接看下语法: db.collection.find(query, projection) query :可选,使用查询操作 ...

  6. 西安Uber优步司机奖励政策(8月10日到8月16日)

    1) 工作日(周一到周五)早高峰时间段(7点到9:30点).晚高峰时间段(5点到8点)车费 2.0 倍,每单奖励部分上限35元 例:在高峰时段中,假设行程基本车费为¥15,只要达到奖励前提,最后你将获 ...

  7. 宁波Uber优步司机奖励政策(8月24日到8月30日)

    本周奖励: 8月24日-8月30日: 滴滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http:// ...

  8. 【POJ2482】Stars in Your Window

    [POJ2482]Stars in Your Window 题面 vjudge 题解 第一眼还真没发现这题居然™是个扫描线 令点的坐标为\((x,y)\)权值为\(c\),则 若这个点能对结果有\(c ...

  9. sql server 对Geography 的增(insert)和查询(select)

    insert:    Location为    Geography类型                INSERT INTO [oss1].[dbo].[Order] ([Location]) VAL ...

  10. 11、Java并发编程:并发容器之CopyOnWriteArrayList

    Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...