黑马程序员技术交流社区
标题:
关于异常
[打印本页]
作者:
〃Mr.Zぐ
时间:
2013-4-14 15:52
标题:
关于异常
java抛出的异常是在哪里处理?是谁调用在哪里处理么?throw和抛出异常有什么关系了?
作者:
李程
时间:
2013-4-14 16:09
本帖最后由 李程 于 2013-4-14 16:15 编辑
简要回答你的问题,我的理解:谁都可抛出异常,或者声明异常。抛出异常就要有人接受异常,谁调用抛出或者声明异常的部分,谁就负责处理异常,要么声明,要么处理,如果谁都不处理,就这么一直往上抛啊抛,最后抛到主函数,如果主函数也不处理,就只能抛给jvm来进行默认处理了。。。。
这是毕老师关于异常的笔记和一些起我自己的心得,看下你会更明白的,尤其是下面红色的部分
1,异常就是程序在运行的时候出现了不正常的情况
由来:问题也是现实生活中具体的一个事物,也可通过java的类的形式进行描述,并且进行封装
其实就是java对不正常情况进行描述后的对象体现
问题的划分分为两种:
第一种是严重的问题:java通过Error类进行描述
一般不编写针对性的代码对其进行处理
另一种是非严重的问题:java通过Exception类进行描述
可以使用针对性的处理方式进行处理
无论Error或者Exception,都有一些共性内容,例如不正常情况的信息,引发原因等等
所以向上抽取:
Throwable
|--Error
|--Exception
2,异常的处理
java提供了特有的语句进行处理
格式:
try
{
需要被检测的代码;
}
catch(异常类 变量)
{
处理异常的代码,也就是处理方式
}
finally
{
一定会执行的语句;
}
3,对捕获到的异常对象进行常见方法操作
String getMessage();
String toString();//异常名称,异常信息
printStackTrace();异常名称,异常信息,异常出现的位置
其实jvm默认的异常处理机制就是调用printStackTrace方法
打印异常在堆栈的跟踪信息
4,异常声明
先上代码:
class Demo
{
int div(int a, int b)throws Exception//在功能上通过throws关键字声明了该
//功能有可能发生问题
{
return a/b;
}
}
这里,div抛出异常,给了调用div的主函数,这时候主函数也可以抛出异常给调用主函数的虚拟机。。。。所以对于异常,可以声明抛出,也可以进行捕捉处理
5,对多异常的处理
第一,声明异常的时候,建议声明更为具体的异常
第二,被调用的功能声明几个异常,就对应有几个catch块,不要定义多余的catch块
如果多个catch块中的异常出现继承关系,那么父类异常catch块放在最下面
建议在进行catch处理的时候,catch中一定要定义具体的处理方式
不要仅仅简单定义一句e.printStackTrace()
也不要仅仅简单打印一句输出语句
一般处理方式:将异常情况记录在硬盘文件,也就是异常日志。
6,自定义异常
因为项目中经常会出现一些特有的问题,而这些问题并没有被java描述并封装对象,所以这些特有的问题,可以按照java对问题封装的思想,将特有的问题,进行自定义的异常封装
当在函数内部出现了throw抛出异常现象,那么就必须要给出对应的处理动作
要么在内部try catch处理
要么在函数上声明让调用者处理
一般情况下,函数内出现异常,函数上需要声明。
那么如何定义异常信息呢?
因为父类中已经把异常信息的操作都完成了,所以子类只要在构造的时候,调用父类的构造函数(即super语句),将异常信息传递给父类。这样就可以直接通过getMessage方法获取自定义的异常
自定义异常:
必须是自定义类继承Exception
原因就是:
异常体系有一个特点:因为异常类和异常对象都需要被抛出,他们都具备可抛性,这个可抛性是Throwable这个体系中独有的特点
只有这个体系中的类和对象才可以被throw和throws操作,而这两个关键字的区别为:
throws使用在函数上,后面跟的是异常类,可以跟多个,用逗号隔开
throw使用在函数内,后面跟的是异常对象
作者:
liuyangyang
时间:
2013-4-14 16:14
你好,
java将程序出现的问题写成一个个的异常类,多个异常类(和接口)形成了一个异常体系。顶层类为Throwable;
当程序中某个地方出现问题时可通过throws,try,catch,finally来处理。也可以自定义异常。(注:JAVA虚拟机中也带有处理机制)
throws:把问题向上抛(抛给调用他的函数),此关键字应用在函数上。可以跟多个异常。
throw:只能抛出单个异常,应用在函数内。
try:将可能出现异常的代码放在try中进行检测。
catch:用来处理try中捕捉到的异常。
finall:在finall中的代码一定会被执行,通常用来释放资源。
作者:
love_java
时间:
2013-4-14 18:18
如果不抛出异常则是在catch块里,抛出则由调用方法的类处理。
1、throws关键字通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以使用逗号隔开。当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象。
2、throw关键字通常用在方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即停止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法声明中指明要跑出的异常;如果要捕捉throw抛出的异常,则必须使用try—catch语句。
作者:
胡国彬
时间:
2013-4-14 18:20
一楼那哥们把使用的问题基本上都解决了,我就给你讲一下实际中的是怎么处理的
刚开始学java的时候,我也很好奇,到底java的异常是怎么去处理的.我们平时在网站上或者在使用软件的时候,都会看到一些异常的提示,这就是对系统的异常进行了处理之后的人性化的提示.
一般在开发项目中,显而易见的异常和隐藏的以藏都会有很多,这就需要我们对异常进行捕获并且处理,然后给用户一个人性化的提示.
在开发中,异常的处理有两种方式,一种是在编写代码的时候,将已知的异常进行抛出,然后在最外层进行捕获,然后统一处理,还有一种方式,是使用UncaughtExceptionHandler这个类去对线程中所有的类,已知的或者未知的异常进行捕获,然后重写一个方法进行处理.
另,throw就是抛出一个具体的异常
有问题可以继续追问
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2