异常、日志、断言和调试

1.处理异常
1.1异常分类
所有异常都由Throwable继承而来,分为两个分支:
Error类:Java运行时系统内部错误和资源耗尽错误。
Exception类:两个分支:RuntimeException和IOException
RuntimeException:由程序错误导致的异常,包含情况:(1)错误类型转换(2)数组访问越界(3)访问空指针;
IOException:程序本身没有问题,其他异常,包含情况:(1)试图在文件尾部后面读取数据(2)试图打开一个错误格式的URL(3)试图根据给定字符串查找Class对象,而这个字符串表示的类并不存在
未检查异常:派生于Error类或RuntimeException类;
已检查异常:其他异常。
编译器将检查是否为所有已检查异常提供异常处理器。
1.2声明已检查异常
方法应该在其首部声明所有可能抛出的异常。在下面4种情况应在方法中抛出异常:
(1)调用一个抛出已检查异常的方法;
(2)程序运行过程中发现错误,并利用throw语句抛出一个已检查异常
(3)程序出现错误
(4)Java虚拟机和运行时库出现的内部异常
如果一个方法有可能抛出多个已检查异常,那么必须在方法首部列出所有异常类,逗号分隔。
!!子类中覆盖超类的一个方法,则子类方法中声明的已检查异常不能超过超类方法中声明的异常范围。
1.3抛出异常
1.4创建自定义异常
1.5捕获异常
如果异常发生时没有在任何地方进行捕获,程序会终止运行。

   try{
   ...
   }catch(){
      ...
    }

如果try语句块中的任何代码抛出了一个在catch字句中说明的异常类,那么:
(1)程序会跳过try块中其余代码
(2)执行catch字句中处理器代码
未抛出异常则跳过catch字句。
通常,捕获知道如何处理的异常,抛出不知如何处理的异常。
1.6可以捕获异常后再抛出异常,目的:改变异常类型

  try{
   ...
   }catch(SQLException e){
      Throwable se = new ServletException("database error");
      se.initCause(e);
      throw se;
    }
  //捕获到异常时,重新得到原始异常:Throwable e = se.getCause();

1.7Finally字句
不管是否有异常被捕获,finally字句中的代码都被执行(可以确保关闭数据库连接)。

   InputStream in = ...;
   try{
     try{
      ...
     }finally{
       in.close();
     }
   }catch(IOException e){
     ...
   }
   //这种结构可以报告finally字句中出现的错误

1.8分析堆栈跟踪元素

  Throwable t = new Throwable();
  StackTraceElement[] frames = t.getStackTrace();
  for(StackTraceElement fram:frames){
    ...
  }
   Map<Thread,StackTraceElement[]> map = Thread.getAllStackTraces();
   for(Thread t:map.keySet()){
      StackTraceElement[] frames = map.get(t);
      ...
   }

2.断言
断言机制允许在测试期间向代码中插入一些检查语句。当代码发布时,这些插入的检测语句将会被自动的移走。
3.记录日志
3.1基本日志
默认日志记录器:Logger.global
调用info方法记录日志信息:Logger.global.info(“File->Open menu item selected”);
记录内容自动包含时间、调用的类名和方法名。
取消所有日志:Logger.global.setLevel(Level.OFF).
3.2高级日志
第一次请求一个具有给定名字的日志记录器时,就会创建这个记录器:
Logger myLogger = Logger.getLogger(“com.mycompany.myapp”)
日志记录器的父与子间共享某些属性。如:”com.mycompany.myapp”会继承”com.mycompany”日志记录器的日志级别。
7个日志记录器级别:SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST.(默认只记录前三个级别)
设置级别:logger.setLevel(Level.FINE);此时,FINE和更高级别的记录都可以记录下来。
开启所有级别记录:Level.ALL;
关闭所有级别记录:Level.OFF.
所有级别都有记录方法:logger.warning(message);logger.fine(message).
还可用log方法指定级别:logger.log(Level.FINE,message);
默认日志记录将显示包含日志调用类名方法名,像堆栈显示的那样。
如果虚拟机对执行过程进行了优化,就得不到准确调用信息。此时可用logp方法:
void logp(Level l,String className,String methodName,String message)
3.3修改日志管理器配置
3.4本地化
3.5处理器
日志记录器默认将记录发送到ConsoleHandler中,并由它输出到System.err流中。
3.6过滤器
3.7格式化器
3.8日志记录说明
4.调试
(1)myeclipse中,Run->Debug As->Java Application启动调试器。
(2)鼠标移到希望设置断点的那一行,在左侧空白处右击,选择”Toggle Breakpoint”
(3-1)Run->Step Into(快捷键”F5”):跟踪到每个方法调用的内部;
(3-2)Run->Step Over(快捷键”F6”):定位到下一行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值