A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 〃Mr.Zぐ 中级黑马   /  2013-4-14 15:52  /  1220 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java抛出的异常是在哪里处理?是谁调用在哪里处理么?throw和抛出异常有什么关系了?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 李程 于 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使用在函数内,后面跟的是异常对象

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
你好,
java将程序出现的问题写成一个个的异常类,多个异常类(和接口)形成了一个异常体系。顶层类为Throwable;
当程序中某个地方出现问题时可通过throws,try,catch,finally来处理。也可以自定义异常。(注:JAVA虚拟机中也带有处理机制)
throws:把问题向上抛(抛给调用他的函数),此关键字应用在函数上。可以跟多个异常。
throw:只能抛出单个异常,应用在函数内。
try:将可能出现异常的代码放在try中进行检测。
catch:用来处理try中捕捉到的异常。
finall:在finall中的代码一定会被执行,通常用来释放资源。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
如果不抛出异常则是在catch块里,抛出则由调用方法的类处理。

1、throws关键字通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以使用逗号隔开。当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象。
2、throw关键字通常用在方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即停止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法声明中指明要跑出的异常;如果要捕捉throw抛出的异常,则必须使用try—catch语句。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
一楼那哥们把使用的问题基本上都解决了,我就给你讲一下实际中的是怎么处理的
刚开始学java的时候,我也很好奇,到底java的异常是怎么去处理的.我们平时在网站上或者在使用软件的时候,都会看到一些异常的提示,这就是对系统的异常进行了处理之后的人性化的提示.
一般在开发项目中,显而易见的异常和隐藏的以藏都会有很多,这就需要我们对异常进行捕获并且处理,然后给用户一个人性化的提示.
在开发中,异常的处理有两种方式,一种是在编写代码的时候,将已知的异常进行抛出,然后在最外层进行捕获,然后统一处理,还有一种方式,是使用UncaughtExceptionHandler这个类去对线程中所有的类,已知的或者未知的异常进行捕获,然后重写一个方法进行处理.
另,throw就是抛出一个具体的异常
有问题可以继续追问

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马