JAVA中的throws和throw的区别

Java

一直对java中的throws和throw不太理解。最近一直在查这两个方面的资料,算是能明白一点吧。如果我下面的观点哪有不对,希望指出来,我加以改进。

throw:(针对对象的做法)

抛出一个异常,可以是系统定义的,也可以是自己定义的。下面举两个例子:

抛出Java中的一个系统异常:

public class One {

public void yichang(){

NumberFormatException e = new NumberFormatException();

throw e;

}

public static void main(String[] args){

One test = new One();

try{

test.yichang();

}catch(NumberFormatException e){

System.out.println(e.getMessage());

}

}

}

抛出一个自定义的异常:

public class People {

public static int check(String strage) throws MyException{

int age = Integer.parseInt(strage);

if(age < 0){

throw new MyException("年龄不能为负数!");

}

return age;

}

public static void main(String[] args){

try{

int myage = check("-101");

System.out.println(myage);

}catch(NumberFormatException e){

System.out.println("数据格式错误");

System.out.println("原因:" + e.getMessage());

}catch(MyException e){

System.out.println("数据逻辑错误");

System.out.println("原因:" + e.getMessage());

}

}

}

public class MyException extends Exception{

private static final long serialVersionUID = 1L;

private String name;

public MyException(String name){

this.name = name;

}

public String getMessage(){

return this.name;

}

}

throws:(针对一个方法抛出的异常)

抛出一个异常,可以是系统定义的,也可以是自己定义的。

抛出java中的一个系统异常:

public class One {

public void yichang() throws NumberFormatException{

int a = Integer.parseInt("10L");

}

public static void main(String[] args){

One test = new One();

try{

test.yichang();

}catch(NumberFormatException e){

System.out.println(e.getMessage());

}

}

}

抛出一个自定义异常:

public class People {

public static int check(String strage) throws MyException{

int age = Integer.parseInt(strage);

if(age < 0){

throw new MyException("年龄不能为负数!");

}

return age;

}

public static void main(String[] args){

try{

int myage = check("-101");

System.out.println(myage);

}catch(NumberFormatException e){

System.out.println("数据格式错误");

System.out.println("原因:" + e.getMessage());

}catch(MyException e){

System.out.println("数据逻辑错误");

System.out.println("原因:" + e.getMessage());

}

}

}

public class MyException extends Exception{

private static final long serialVersionUID = 1L;

private String name;

public MyException(String name){

this.name = name;

}

public String getMessage(){

return this.name;

}

}

那么下面我要说究竟什么时候用哪种:

如果是系统异常的话可以什么都不用做,也可以针对方法抛出一个异常,因为系统异常是可以被系统自动捕获的,所以这个异常究竟是要在方法内部解决还是交给上层函数去解决其实效果是一样的。但是我查了很多资料,即使会抛出异常能被系统所捕获的话还是建议针对方法写一个throws,因为这样在完成一个大型任务的时候可以让别的程序员知道这里会出现什么异常。

如果是自己定义的异常,则必须要用throws抛出该方法可能抛出的异常,否则编译会报错。

当然,你需要明白异常在Java中式以一个对象来看待。
并且所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,但是一般情况下Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行。
直接进入正题哈:
1.用户程序自定义的异常和应用程序特定的异常,必须借助于 throws 和 throw 语句来定义抛出异常。

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

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

举例:

throws E1,E2,E3只是告诉程序这个方法可能会抛出这些异常,方法的调用者可能要处理这些异常,而这些异常E1,E2,E3可能是该函数体产生的。
throw则是明确了这个地方要抛出这个异常。

如: void doA(int a) throws IOException,{
           try{
                 ......

}catch(Exception1 e){
              throw e;
           }catch(Exception2 e){
              System.out.println("出错了!");
           }
           if(a!=b)
              throw new  Exception3("自定义异常");
}

代码块中可能会产生3个异常,(Exception1,Exception2,Exception3)。
如果产生Exception1异常,则捕获之后再抛出,由该方法的调用者去处理。
如果产生Exception2异常,则该方法自己处理了(即System.out.println("出错了!");)。所以该方法就不会再向外抛出Exception2异常了,void doA() throws Exception1,Exception3 里面的Exception2也就不用写了。
而Exception3异常是该方法的某段逻辑出错,程序员自己做了处理,在该段逻辑错误的情况下抛出异常Exception3,则该方法的调用者也要处理此异常。

throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
throws语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。

throws主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常。
throw是具体向外抛异常的动作,所以它是抛出一个异常实例。

throws说明你有那个可能,倾向。
throw的话,那就是你把那个倾向变成真实的了。

同时:
1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

时间: 2024-10-14 01:59:43

JAVA中的throws和throw的区别的相关文章

Java中的throws与throw关键字

作者:苗老师,华清远见嵌入式学院讲师. Java中的异常处理还是比较有意思的!就是该你管就你管,不是你该管的,最好不要越级管理!不然我这级管理存在就没有意义! Java的异常处理是通过5个关键字来实现的:try,catch,throw,throws,finally.这里我主要说一下throw,throws. throws语句 throws总是出现在方法声明时,用来标明该成员方法可能抛出异常.如果是多个异常,使用逗号隔开.对大 多数Exception子类来说,Java 编译器会强迫你声明在一个成员

day08(异常处理,创建异常,finally,throws和throw的区别)

异常处理, 异常的产生  运行时异常:程序运行中产生的异常:RuntimeException类.   编译时异常:程序在编译时产生的异常:除了RuntimeException类  其他都是编译时产生的异常.    处理异常两种方式 抛出异常:把异常抛给调用者区解决   throws 抛出异常 捕获异常:编程者自己处理try....catch...finally... 创建异常, 1.自己创建sun公司的异常类对象 public class ClassException { public stat

java中的hashcode和euqals的区别和联系

一.equals方法的作用 1.默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象). 2 .要是类中覆盖了equals方法,那么就要根据具体的代码来确定equals方法的作用了,覆盖后一般都是通过对象的内容是否相等来判断对象是否相等. 没有覆盖equals方法代码如下: [java] view plaincopy //学生类 public class S

Java中PreparedStatement和Statement的用法区别

Java中PreparedStatement和Statement的用法区别 (2012-08-01 11:06:44) 转载▼ 标签: 杂谈   1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象. 2.作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能.三种方法 execute. executeQuery

JAVA中extends 与implements有啥区别?

JAVA中extends 与implements有啥区别?1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口.extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用2.extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,JAVA中不支持多重继承,但是可以用接口

Java中针对 ArrayList和LinkedList 的区别

一般大家都知道ArrayList和LinkedList的大致区别:      1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.      2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针.      3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据. ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用

java中Map,List与Set的区别

java中Map,List与Set的区别 目录(?)[+] Set,List,Map的区别 java集合的主要分为三种类型: Set(集) List(列表) Map(映射) 要深入理解集合首先要了解下我们熟悉的数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. 简单说下集合和数组的区别:(参考文章:

(12)throws和throw的区别

函数上指写在小括号和大括号之间int div(int a ,intb) throws 后面跟异常 throw定义在函数内 后面跟异常对象 (12)throws和throw的区别

面向对象(throws和throw的区别)

/** * Created by Administrator on 2014/9/29. * * throws和throw的区别 * * throws使用在函数上,throw使用在函数内 * * throws后面跟的是异常类,可以跟多个,用逗号连接 * throw后面跟的是异常对象 */ //copyright?liupengcheng //http://www.cnblogs.com/liupengcheng class fushuException extends Exception {