马太效应 发表于 2017-8-5 23:47:14

Java暑期学习Day32

今天是第32天,20170805,为了美好的生活前进{:10_307:}

static/image/hrline/5.gif

① throws/throw 关键字
a.在catch区块进行完部分错误处理时,可以使用throw(!!注意不是throws
如果一个方法没有捕获一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。 )将异常再抛出,实际上,我们可以在任何流程中抛出异常,不一定要在catch区块中,在流程中抛出异常,就直接跳离原有的流程,可以抛出受检或非受检异常。
-!- 如果抛出的是受检异常,此时就必须在方法上使用throws声明。
                   非受检异常                不使用


b.如果使用继承时,父类某个方法声明throws某些异常,子类重新定义该方法时
可以:
1.不声明throws任何异常
2.throws父类该方法中声明的某些异常
3.throws父类该方法中声明异常的子类
不可以:
1.throws父类方法中未声明的其他异常
2.throws父类方法中声明异常的父类


② 自定义异常
重新抛出异常时,除了将捕捉到的异常直接抛出,也可以考虑为应用程序自定义专属的异常类别,让异常更能表现应用程序特有的错误信息。
自定义异常类别时,可以继承Throwable、Error、 Exception的相关子类(即所有异常都必须是 Throwable 的子类),通常建议继承自Exception或其子类,如果不是继承自Error或RuntimeException,那么就会是受检异常。


public class Ce extends Exception{                           //自定义受检异常
         ...
}


-!-如果希望写一个检查性异常类,则需要继承 Exception 类
      如果想写一个运行时异常类,那么需要继承 RuntimeException 类


③ 堆栈追踪(Stack Trace)

package exception;

public class StackTraceDemo {
        public static void main(String[] args) {

                try {
                        c();
                } catch (NullPointerException ex) {
                        ex.printStackTrace();

                }

        }

        static void c() {
                b();
        }

        static void b() {
                a();
        }

        static String a() {
                String text = null;
                return text.toUpperCase();
        }

}

查看堆栈追踪最简单的方法,就是直接调用异常对象的printStackTrace()。

上面代码的运行结果是——
java.lang.NullPointerException
at exception.StackTraceDemo.a(StackTraceDemo.java:25)
at exception.StackTraceDemo.b(StackTraceDemo.java:20)
at exception.StackTraceDemo.c(StackTraceDemo.java:16)
at exception.StackTraceDemo.main(StackTraceDemo.java:7)


堆栈追踪信息中显示了异常类型,最顶层是异常的根源,以下是调用方法的顺序,程序代码行数是对应于当初的程序原始码。





页: [1]
查看完整版本: Java暑期学习Day32