程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-05(5)

Java核心技术(六):异常、断言、日志和调试

发布于2021-05-29 21:44     阅读(1206)     评论(0)     点赞(27)     收藏(4)


最近发现自己调bug的能力不足,显然多跑代码是最有效的提高办法,但在这之前有必要储备一些理论常识。

如果想要深入了解这部分的内容,建议阅读一下相应的源码和api。


一、处理错误

1.常见错误

程序中常见的错误:

  • 用户输入错误
  • 设备错误
  • 物理存储限制
  • 代码错误

在这里插入图片描述

派生于RuntimeException的异常包含下面几种情况∶

  • 错误的类型转换。
  • 数组访问越界。ArrayIndexOutOfBoundsException
  • 访问空指针。NullPointerException

如果出现了RuntimeException,就一定是你的问题。

不是派生于 RuntimeException 的异常包括∶

  • 试图在文件尾部后面读取数据。
  • 试图打开一个不存在的文件。
  • 试图根据给定的字符串查找 Class对象,而这个字符串表示的类并不存在。

未检查异常: 派生于Error类、RuntimeException类的所有异常。
已检查异常: 其他异常,派生于IOException类的异常。编译器将核查是否为所有的已检查异常提供了异常处理器。

2.声明已检查异常

如果遇到了无法处理的情况,那么 Java 的方法可以抛出一个异常。这个道理很简单∶一个方法不仅需要告诉编译器将要返回什么值,还要告诉编译器有可能发生什么错误。例如,一段读取文件的代码知道有可能读取的文件不存在,或者内容为空,因此,试图处理文件信息的代码就需要通知编译器可能会抛出 IOException类的异常。

public demo(String name) throws FileNotFoundException,xxException{

}

3.抛出异常

//写法一
throw new EOFException();

//写法二
EOFException e=new EOFException();
throw e;

一旦方法抛出了异常,这个方法就不可能返回到调用者。也就是说,不必为返回的默认值或错误代码担忧。

4.创建异常类

习惯上,定义的类应该包含两个构造器,一个是默认的构造器;另一个是带有详细描述信息的构造器(超类 Throwable 的 toString 方法将会打印出这些详细信息,这在调试中非常有用)。

//自定义异常
class FileFormatException extends IOException
{
    public FileFormatException(){}
    public FileFormatException(String gripe){
        super(gripe);
    }
}
//抛出异常
public String demo(int in)throws FileFormatException{
    if(in==1) throw new FileFormatException();
    return "return";
}

//捕获异常
Demo demo=new Demo();
try{
    demo.demo(1);
}catch(FileFormatException e){
    System.out.println("异常出现");
    e.printStackTrace();
}

运行结果:

在这里插入图片描述

5.捕获异常

捕获单个异常:

Demo demo=new Demo();
try{
      demo.demo(1);
   }
catch(FileFormatException e){
      System.out.println("异常出现");
      e.printStackTrace();
}

捕获多个异常:

注意,这只是展示语法规则,实际上不存在这几个异常类:

Demo demo=new Demo();
try{
      demo.demo(1);
   }
catch(Exceptio1 e1|Exception2 e2){
      System.out.println("异常出现");
}
catch(Exception3 e){
}
catch(Exception4 e){
}

可以在catch字句中再次抛出异常。

finally子句:

try{
}catch(){
}finally{
	System.out.println("finally");
}

子句执行顺序:

try{
	//1
	...
	//2
}catch(){
	//3
	...
	//4
}finally{
	//5
	System.out.println("finally");
}
//6
  • 情况1:如果try中没有抛出异常

执行顺序是:1、2、5、6

  • 情况2:如果try中抛出了异常且catch中没有再次抛出

执行顺序是:1、3、4、5、6

  • 情况3:如果try中抛出了异常且catch中再次抛出

执行顺序是:1、3、5、6

  • 情况4:如果try中抛出了异常且catch没有捕获到

执行顺序是:1、5

注意:finally中也有可能会再次抛出异常

6.异常使用技巧

  • 异常处理不能代替简单的测试,有时捕获异常的代价会更大,因此只在异常情况下使用异常机制。
  • 不要过分地细化异常,这样会导致代码量膨胀。
  • 利用异常层次结构,应该寻找更加适当的子类或创建自己的异常类。
  • 在 Java中,往往强烈地倾向关闭异常。如果认为异常非常重要,就应该对它们进行处理。
  • 早抛出晚捕获:异常要尽早抛出,一般是在发生异常的第一现场进行异常的抛出,而不是在代码的 “使用者” 中捕获异常,然后再进行包装抛出;晚捕获说的是要在有能力处理这个异常的地方进行捕获,而不要一发生异常立即捕获,在没有能力处理异常的时候进行捕获,容易造成异常的丢失。

二、断言

//写法一
assert 条件;
//写法二
assert 条件:表达式;

这两种形式都会对条件进行检测,如果结果为 false,则抛出一个 AssertionError 异常。在第二种形式中,表达式将被传入 AssertionError 的构造器,并转换成一个消息字符串。

三、记录日志

关于日志这部分只做简单介绍,因为之后会学习专门的日志框架,原生的并不是那么好用。

1.基本日志

Logger.getGlobal()是一个默认日志记录器

public static void main(String[] args) {
   Logger.getGlobal().info("默认日志记录器");
}

在这里插入图片描述

Logger.getGlobal().setLevel(Level.OFF);//关闭日志记录器
Logger.getGlobal().setLevel(Level.INFO);//激活全局日志记录器

日志级别

  • SEVERE
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST

在默认情况下,只记录前三个级别,设置级别:


logger.setLevel(Level.FINE);//设置级别
logger.setLevel(Level.OFF);//关闭所有级别的记录
logger.setLevel(Level.ALL);//开启所有级别的记录

默认的日志配置记录了INFO 或更高级别的所有记录,因此,应该使用 CONFIG、 FINE、FINER和FINEST级别来记录那些有助于诊断,但对于程序员又没有太大意义的调试信息。

2.高级日志

在企业级程序中,最好不要将所有的日志都记录到一个全局日志记录器中,而是自定义日志记录器。

private static final Logger myLogger=Logger.getLogger("com.wang.mylog");

父子记录器之间将共享某些属性,比如,如果对com.wang这个父记录器设置了日志级别,子记录器也会继承这个级别。

四、调试技巧

  • 最直白的办法:用System.out.println()直接打印。
  • 使用日志:原始一点的如Logger.getGlobal().info()记录变量的值,还可以使用日志框架。
  • 为每个类放一个main方法,就可以直接单元测试了,看上去傻但却很有用。
  • 目前常用的是JUnit测试框架,spring boot可以很简单地集成,很方便的。
  • 捕获并处理异常,进行堆栈跟踪。

还有很多可以学习的调试技巧,这里只是列举了最简单的几种。

原文链接:https://blog.csdn.net/Tracycoder/article/details/117041278



所属网站分类: 技术文章 > 博客

作者:小光头吃饭不用愁

链接:http://www.javaheidong.com/blog/article/207536/a712d0404eb417ffb1f8/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

27 0
收藏该文
已收藏

评论内容:(最多支持255个字符)