鱼C论坛

 找回密码
 立即注册
查看: 2241|回复: 0

[学习笔记] Java暑期学习Day33

[复制链接]
发表于 2017-8-6 23:46:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 马太效应 于 2017-8-6 23:46 编辑

今天是第33天,依旧异常,20170806


                               
登录/注册后可看大图


① 堆栈追踪(plus)
  要善用堆栈追踪,前提是程序代码中不可有私吞异常的行为对异常做了不适当的处理,或显示了不正确的信息
  例如在捕捉异常后什么也不做:
  try{
   ...
  }catch (SomeException ex){
   //里面什么都没有,绝对不要这样做-!-
}


  这样的程序代码会对应用程序维护造成严重伤害,因为异常信息会完全中止,之后调用此片段程序代码的客户端,完全不知道发生了什么事,造成除错异常困难,甚至找不出错误根源


  在使用throw重抛异常时,异常的追踪堆栈起点,仍是异常的发生根源,而不是重抛异常的地方。
  
  1. <div>package exception;</div><div>
  2. </div><div>public class StackTraceDemo2 {

  3.         public static void main(String[] args) {
  4.                 try {
  5.                         c();
  6.                 } catch (NullPointerException ex) {
  7.                         ex.printStackTrace();

  8.                 }

  9.         }

  10.         static void c() {
  11.                 try{
  12.                         b();
  13.                 }catch(NullPointerException ex){
  14.                         ex.printStackTrace();
  15.                         throw ex;

  16.                 }
  17.                 }

  18.         static void b() {
  19.                 a();
  20.         }

  21.         static String a() {
  22.                 String text = null;
  23.                 return text.toUpperCase();         //将字符串转换成char值的大写形式
  24.         }

  25. }
  26. </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对象。如:

  1. package exception;

  2. public class StackTraceDemo3{

  3.         public static void main(String[] args) {
  4.                 try {
  5.                         c();
  6.                 } catch (NullPointerException ex) {
  7.                         ex.printStackTrace();

  8.                 }

  9.         }

  10.         static void c() {
  11.                 try{
  12.                         b();
  13.                 }catch(NullPointerException ex){
  14.                         ex.printStackTrace();
  15.                         Throwable t=ex.fillInStackTrace();
  16.                         throw(NullPointerException) t;

  17.                 }
  18.                 }

  19.         static void b() {
  20.                 a();
  21.         }

  22.         static String a() {
  23.                 String text = null;
  24.                 return text.toUpperCase();
  25.         }

  26. }
复制代码
结果是——
  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()显示文字描述结果。


  


评分

参与人数 1鱼币 +3 收起 理由
小甲鱼 + 3

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 13:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表