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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Zack 中级黑马   /  2015-4-21 15:45  /  433 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

小弟学到异常部分,逻辑有些混乱。问,自定义异常时,如果继承RuntimeException的话,实际操作中需要覆盖哪些属性和方法,如果是其他编译时检测的异常,又需要怎么写,请大神们举个实际例子讲解一下。Orz

9 个回复

倒序浏览

。。。。
回复 使用道具 举报
真的牛,双手赞成,谢谢了
回复 使用道具 举报
我喜欢,请大家鼓掌支持,谢谢
回复 使用道具 举报
我们先给出一个例子,看看异常有什么用?

public class Test {
    public static void main(String[] args) {
        int userInput=0;
        int I = 6 / userInput;
        System.out.println("优雅结束");
    }
}

输出结果:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at Test.main(Test.java:4)


public class Test {
    public static void main(String[] args) {
        try
        {
            int userInput=0;
            int I = 6 / userInput;
        }
/*系统把错误信息放在Exception的对象e中*/        
        catch(Exception e)
        {
            System.out.println(e);
        }
        System.out.println("优雅结束");
    }
}

输出结果:

java.lang.ArithmeticException: / by zero
优雅结束


通过上面的例子,我们看出通过引入异常这种技术,即使出现不测(用户把0赋给除数),也可以让程序不崩溃,还能继续优雅的运行。这种技术有用,值得学。当你批量下载文件时,如出现什么错误,你是不是希望下载器能告诉你出现了什么问题,比如硬盘不足等等,在你提供了足够的硬盘空间以后,下载继续自动进行。而不是说空间一不足,立刻下载器就崩溃呀!这就是异常技术。

异常这种技术框架是怎么工作的?
注意是运行程序时,而不是编译时,当一个非正常情况出现,比如除0,就叫异常情况。
为了能优雅的处理异常情况(在出现异常情况后,程序不崩溃,还能继续优雅的运行), Sun公司设计了异常技术框架,你把可能出现问题的语句放在try块儿中,真出了问题的话,系统会把问题的信息存放在一个异常类的对象中传入到catch块中,在catch块儿中,你可以专门根据错误信息作处理。这样业务代码放在try块儿中,错误处理代码放在catch中,好处是易读,条理清楚。
!!没有try catch这种异常技术前,业务代码和排错代码是搅和在一起的!
我怎么知道哪块代码可能出现问题,从而放在try块儿中呢?
一个笨办法,开始时,你并不加try,但你发现,运行时,用户赋给除数一个0,所以程序在这崩溃了,于是你就把这块代码加个try,过两天,用户又犯了一个数组越界的错误,致使程序崩溃了。你又加了个try, 久而久之,你的try块儿就会变得越来越大,你的代码就会变得越来越健壮。再往后,你就有经验了,你自然知道常规的,只要用户可以赋给除数值时,就应该放在try块儿当中。

我怎么知道应该捕获什么样的异常?
如上例:开始没加try时,程序崩溃,系统打印的是如下的错误,Exception in thread "main" java.lang.ArithmeticException: / by zero at Test.main(Test.java:4), 所以我们就该捕获ArithmeticException.见下例。

public class Test {
    public static void main(String[] args) {
        try
        {
            int userInput=0;
            int I = 6 / userInput;
        }
        catch(ArithmeticException e)
        {
            System.out.println(e);
        }
        System.out.println("优雅结束");
    }
}

输出结果:

java.lang.ArithmeticException: / by zero
优雅结束

顺便提一句,和Exception相对应的,还有Error,Error(错误)表示系统级的错误和程序不必处理的异常,是JRE(java运行环境)的内部错误或者硬件问题,比如,另外某一处地方的bug引起的内存溢出,内存资源不足等,OutOfMemoryError,对这类错误,程序基本无能为力,只能退出。

例:

public class Test {
/* maxMemory将返回java虚拟机所能返回的最大可用内存。0.92可以, 0.93就报错 */
    int size win = (int) (Runtime.getRuntime().maxMemory() * 0.93);
    public void allo() {
        byte[] data1 = new byte[win];
    }
    public static void main(String[] args) {
        Test t = new Test();
        t.allo();
    }
}

输出结果:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at Test.allo(Test.java:5)
    at Test.main(Test.java:9)
回复 使用道具 举报
知道了 不错~~~
回复 使用道具 举报
Zack 中级黑马 2015-4-22 11:49:42
7#
古典牧童 发表于 2015-4-21 20:10
我们先给出一个例子,看看异常有什么用?

public class Test {

实力混分,复制粘贴,文不对题,哈哈哈 可以的大兄弟
回复 使用道具 举报
小龟 中级黑马 2015-4-22 13:41:14
8#
支持一下~
回复 使用道具 举报
我很喜欢,太精彩了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马