java为什么抛出异常?为什么异常是被抛出的不就是产生的吗为什么叫抛出呢
大家好,关于java为什么抛出异常很多朋友都还不太明白,今天小编就来为大家分享关于为什么异常是被抛出的不就是产生的吗为什么叫抛出呢的知识,希望对各位有所帮助!
Java中为什么有的方法必须抛出异常,有的不用
你要明白异常是程序中的一些错误,但并不是所有的错误都是异常,比如0不能做除数你再设计的时候就屏蔽了 int x=0 int y=9 s=y/x如果把0不能做除数这个异常直接显示出来则s=y/x直接就编译不通过了但是你要表示 s=9/0呢编译都不通过怎么表示所以s=9/0要抛出一个异常然后你可以根据这个异常给出提示直接显示出0不能作为除数
JAVA反射为什么总要异常处理
JAVA中的异常和反射
一、异常
1
、异常概貌:
概念: JAVA会将所有的异常、错误抽象成为一个类,其根本父类为Throwable。异常是程
序中所有出乎意料的结果,用名称代表发生的问题,见名知义。我们对于程序可能出现的错
误应该做出预案。异常处理可以提高我们系统的容错性、健壮性。
java.lang.Throwable类是所有异常和错误的顶层类。其两个直接子类是java.lang.Error和
java.lang.Exception。
Error
对象表示程序错误,是底层的、不可恢复的严重错误。此时程序一定会退出,
已经失去了运行所必须的物理环境。因为程序已经退出了,所以对于Error错误无法进
行处理。
我们可处理的只是Exception
类的对象表示的程序异常(例外/异常)。
以下区分:
RuntimeException
(未检查异常):RuntimeException及其子类都称为运行时异常,它
是(UnChecked Exception),特点是Java编译器不会检查它,可以在编程时避免。也就
是说,当程序中出现此类异常时,即使不用try…catch捕获,或不用throws子句抛出,
还是可以编译通过。比如,除数为0的异常ArrithmeticException,就是运行时异常。
非Runtime
异常(已检查异常):包括除了RuntimeException及其子类外的其它Exception
类及其子类,都属于已检查异常(Checked Exception)。其特点是Java编译器会检查它,
我们需要用try…catch语句捕获,或用throws子句声明抛出,否则编译不会通过。比如
打开文件时找不到文件,就属于已检查异常。
Throwable
Error
错误
严重底层错误
不可避免
不可处理
Exception
异常
RuntimeException
未检查异常
(可处理可不处理)
比如除0错误、空指针
非Runtime
已检查异常
(必须处理)
比如打开文件时找不到
2
2
、Java
异常处理机制
(1
)try
…
catch
捕获异常(积极处理异常的方式)
try代码块包含了可能发生异常的程序代码,catch块紧随其后,用来捕获并处理异常。
格式如下:
try
{
可能出现异常的代码块}
catch
(Exception
e)
{
进行异常处理}
注意:一次异常捕获只会匹配一次try…catch
catch中要求必须先捕获子类异常再捕获父类异常。
(2
)finally
任何情况下都必须执行的代码段(紧接在try或catch代码块后面)。
finally无论如何都会被执行,除非JVM退出。所以,finally代码块常常用于释放被占
用的资源。比如关闭文件、网络、数据库连接等。
(3
)throws
声明可能会抛出的异常(消极处理异常的方式)
格式:方法名(参数表)throws
后面接要往上抛的异常。
表示该方法对指定的异常不作任何处理,直接抛往上一层。
static void methodA(int i) throws IOException{//一直向上抛(消极处理)
}
public static void main(String[] args) throws IOException{//一直抛到JVM
}
多个异常,用逗号隔开。throws IOException, SQLException
throws后的异常允许多态。比如IOException,会包括抛出其子类。
注意:不允许子类比父类抛出范围更大、更多的异常。
方法覆盖时,修饰符要越来越宽;抛例外则要越来越窄。
throws
和try
…
catch
经常配合使用,把异常传递给最能处理此异常的方法中,体现各
司其职的特点。
Java
中处理异常方式
消极throws用在方法的声明上
积极try…catch…finally
public static int fn(int b){
try{
return b/2;
}catch(Exception e){
return 0;
}finally{
return b;//返回的结果是一定是b;
}
}
3
(4
)throw
抛出异常
打个比方:
public void eat() throws FoodException{//自定义FoodException是以下异常的父类
if(没有食物) throw new NoFoodException(“呵呵,没有食物”);
if(发现苍蝇) throw new FoundFlyException(“哎呀,发现半只苍蝇”);
}
比较throw
和throws
:
throw
是一个语句,它出现在方法体中,用来抛出异常对象。
throws
是出现在方法声明中,表示本方法中会有异常对象向上(调用者)抛出。
throws
后写的是异常类型; throw
后写的是要抛出的异常对象。
(5
)异常处理流程
try…catch…finally,如果遇到return和System.exit()语句:
一如果在finally之前遇到System.exit()则finally语句不再执行,这是finally不被执行
的唯一情况。因为java.lang.System类的静态方法exit()用于终止当前的Java虚拟机进程。exit()
的参数表示程序终止时的状态码,0表示正常终止,非0表示异常终止。
二return语句用于退出本方法。如果在try或者catch代码块中遇到return语句时,若
有finally语句块,会先执行finally代码块。
三不要在finally代码块中使用return语句。因为这样会导致两种潜在错误:A.覆盖了
try或catch块中的return语句; B.导致丢失异常。
try{
①
②
③
} catch(XxxException e){
④
} finally{
⑤
}
⑥
情况一:没有异常,处理顺序为①②③⑤⑥
情况二:在②处有异常,①②④⑤⑥
情况三:有异常,没有被捕获,①②⑤终止
情况四:如果③后有return语句,①②③⑤
情况五:如果遇到System.exit(),则⑤不执行
允许的处理方式:
① try…catch()
② try…finally//与throws配合使用
③ try…catch…finally
④ try…catch(){} catch(){}…//配多个catch
//注意范围大的异常要写在后面
4
(6
)异常处理规则:
①只有在异常情况下才使用异常处理机制;
②保证操作要么一起成功,要么一起失败;
③ try代码块不要太大;
④ catch子句中指定具体的异常类型;
⑤早抛出,晚捕获。
3
为什么异常是被抛出的不就是产生的吗为什么叫抛出呢
"抛出"是当程序有异常"抛"的,不是"生成"的(当然你理解为生成,也未尝不可,关键是理解JAVA程序运行机制,不在于这个术语叫什么).
比如当有除数为零的情况出现,没有异常检测的计算机语言(如C),会直接将程序停止.而JAVA不同,它的异常机制会告诉程序员"你的程序有问题,但不致于致命,你得处理一下",于是,JDK会"抛"出个异常,告诉你这个问题的存在.而程序仍在健壮在生存着.你可以用try...catch...将这个异"捕捉"让你清楚地知道问题所在的地方.
而如果你不愿处理,(或是懒得理它--当然这不是个编程的好习惯!),你就可以将它"抛出",就是在方法体声明的时候THROWS一下,意思就是说"我懒得理它,谁让它有的问题谁处理."于是,将问题留给调用它的那个方法,如果这个方法有处理的方案,就在此处理.而如果调用这个方法的那个方法,仍不愿处理,它也可以"抛"....以此类推,直到到了MAIN()方法了,因为程序就数它大,它不能不管啊.于是即便MAIN()不愿管这事,它也不得不管.但java的main(),还是比较负责的,他不能让程序死掉.于是告诉程序员,你的问题得处理了".
大体就是这个意思了.同学过生日,有点高.还有什么不清楚的,可以给mail我.
Ps;学习java,任何一种语言,我们并不能只是要弄清楚"它为什么叫这个"这个问题上,因为这些都是人们为了方便理解而起的名字而已,计算机可不认识"异常"这几个中国字.我们要理解是的它的机理,本质.我们只要知道我们这样做,计算机就会乖乖的,那样做,计算机就不听话了,就可以了.就好像我们彼此相处一样,我觉得这人好处就行了,只要是铁哥们,你叫他什么,他也高兴,而如果你整天想的是,我该叫他张三还是该叫李四,那就太过无聊了.因为你可以叫他你想叫他的任何名字,因为你们是哥们嘛.你说呢?
--共同进步
好了,文章到此结束,希望可以帮助到大家。