|  | 
 
| 
本帖最后由 马太效应 于 2017-8-6 23:46 编辑
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  
 今天是第33天,依旧异常,20170806
   
 
 
 ① 堆栈追踪(plus)
 要善用堆栈追踪,前提是程序代码中不可有私吞异常的行为、对异常做了不适当的处理,或显示了不正确的信息。
 例如在捕捉异常后什么也不做:
 try{
 ...
 }catch (SomeException ex){
 //里面什么都没有,绝对不要这样做-!-
 }
 
 
 这样的程序代码会对应用程序维护造成严重伤害,因为异常信息会完全中止,之后调用此片段程序代码的客户端,完全不知道发生了什么事,造成除错异常困难,甚至找不出错误根源。
 
 
 在使用throw重抛异常时,异常的追踪堆栈起点,仍是异常的发生根源,而不是重抛异常的地方。
 
 
 复制代码<div>package exception;</div><div>
</div><div>public class StackTraceDemo2 {
        public static void main(String[] args) {
                try {
                        c();
                } catch (NullPointerException ex) {
                        ex.printStackTrace();
                }
        }
        static void c() {
                try{
                        b();
                }catch(NullPointerException ex){
                        ex.printStackTrace();
                        throw ex;
                }
                }
        static void b() {
                a();
        }
        static String a() {
                String text = null;
                return text.toUpperCase();         //将字符串转换成char值的大写形式
        }
}
</div>
结果是——
 
 
 java.lang.NullPointerException
 at StackTraceDemo2.a(StackTraceDemo2.java:29)
 at StackTraceDemo2.b(StackTraceDemo2.java:24)
 at StackTraceDemo2.c(StackTraceDemo2.java:15)
 at StackTraceDemo2.main(StackTraceDemo2.java:5)
 java.lang.NullPointerException
 at StackTraceDemo2.a(StackTraceDemo2.java:29)
 at StackTraceDemo2.b(StackTraceDemo2.java:24)
 at StackTraceDemo2.c(StackTraceDemo2.java:15)
 at StackTraceDemo2.main(StackTraceDemo2.java:5)
 
 
 如果想要让异常堆栈起点为重抛异常的地方,可以使用fillInStackTrace()方法,这个方法会重新装填异常堆栈,将起点设为重抛异常的地方,并返回Throwable对象。如:
 
 
 结果是——复制代码package exception;
public class StackTraceDemo3{
        public static void main(String[] args) {
                try {
                        c();
                } catch (NullPointerException ex) {
                        ex.printStackTrace();
                }
        }
        static void c() {
                try{
                        b();
                }catch(NullPointerException ex){
                        ex.printStackTrace();
                        Throwable t=ex.fillInStackTrace();
                        throw(NullPointerException) t;
                }
                }
        static void b() {
                a();
        }
        static String a() {
                String text = null;
                return text.toUpperCase();
        }
}
java.lang.NullPointerException
 at exception.StackTraceDemo3.a(StackTraceDemo3.java:32)
 at exception.StackTraceDemo3.b(StackTraceDemo3.java:27)
 at exception.StackTraceDemo3.c(StackTraceDemo3.java:17)
 at exception.StackTraceDemo3.main(StackTraceDemo3.java:7)
 java.lang.NullPointerException
 at exception.StackTraceDemo3.c(StackTraceDemo3.java:20)
 at exception.StackTraceDemo3.main(StackTraceDemo3.java:7)
 
 
 第二次显示堆栈追踪的起点,就是重抛异常的起点。
 
 ② 关于assert
 程序执行的某个时间点或某个情况下,必然处于或不处于某种状态,这是一种断言(Assertion)。
 
 Java在JDK1.4之后提供assert语法,有两种使用的语法:
 assert  boolean_expression;
 assert  boolean_expression:detail_expression;
 
 
  boolean_expression若为true,则什么事都不会发生,若为false,则会发生java.lang.AssertionError,此时若采取的是第二个语法,则会将detail_expression的结果显示出来,如果当中是个对象,则调用toString()显示文字描述结果。
 
 
 
 
 
 
 | 
 评分
查看全部评分
 |