Java Review(三十三、异常处理----补充:断言、日志、调试)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Java Review(三十三、异常处理----补充:断言、日志、调试)

   

文章目录

使用断言

断言(Assertion)是一种调试程序的方式。在Java中,使用assert关键字来实现断言。

断言的概念

假设确信某个属性符合要求, 并且代码的执行依赖于这个属性。例如, 需要计算:

double y = Math.sqrt(x);

确信,这里的 X 是一个非负数值。原因是:X 是另外一个计算的结果,而这个结果不可能是负值;或者 X 是一个方法的参数,而这个方法要求它的调用者只能提供一个正整数。

当然还应当进行检查, 以避免让“ 不是一个数” 的数值参与计算操作。

可以抛出一个异常:

if (x < 0) throw new 111egalArgumentException("x < 0");

但是这段代码会一直保留在程序中, 即使测试完毕也不会自动地删除。如果在程序中含有大量的这种检查,程序运行起来会相当慢。

断言机制允许在测试期间向代码中插入一些检査语句。当代码发布时,这些插人的检测语句将会被自动地移走。

Java 语言引人了关键字 assert。这个关键字有两种形式:

assert 条件;
assert 条件:表达式;

这两种形式都会对条件进行检测, 如果结果为 false, 则抛出一个 AssertionError 异常。

在第二种形式中,表达式将被传人 AssertionError 的构造器, 并转换成一个消息字符串。

启用和禁用断言

在默认情况下, 断言被禁用。可以在运行程序时用 -enableassertions 或 -ea 选项启用:

java -enableassertions MyApp

需要注意的是, 在启用或禁用断言时不必重新编译程序。启用或禁用断言是类加载器( class loader) 的功能。当断言被禁用时, 类加载器将跳过断言代码, 因此,不会降低程序运行的速度。

也可以在某个类或整个包中使用断言, 例如:

java -ea:MyClass -eaiconi.inycompany.inylib.. , MyApp

这条命令将开启 MyClass 类以及在 com.mycompany.mylib 包和它的子包中的所有类的断言。选项 -ea 将开启默认包中的所有类的断言。

也可以用选项 -disableassertions 或 -da 禁用某个特定类和包的断言:

ava -ea:... -da:MyClass MyApp

日志

每个 Java 程序员都很熟悉在有问题的代码中插入一些 System.out.println 方法调用来帮助观察程序运行的操作过程。  当然, 一旦发现问题的根源, 就要将这些语句从代码中删去。如果接下来又出现了问题, 就需要再插入几个调用  System.out.println方法的语句。

记录日志API 就是为了解决这个问题而设计的。

下面先讨论这些 API 的优点。

  • 可以很容易地取消全部日志记录,或者仅仅取消某个级别的日志,而且打开和关闭这个操作也很容易。
  • 可以很简单地禁止日志记录的输出, 因此,将这些日志代码留在程序中的开销很小。
  • 日志记录可以被定向到不同的处理器, 用于在控制台中显示, 用于存储在文件中等。
  • 日志记录器和处理器都可以对记录进行过滤。过滤器可以根据过滤实现器制定的标准丢弃那些无用的记录项。
  • 日志记录可以采用不同的方式格式化,例如,纯文本或 XML。
  • 应用程序可以使用多个日志记录器, 它们使用类似包名的这种具有层次结构的名字,例如, com.mycompany.myapp0 •在默认情况下,日志系统的配置由配置文件控制。如果需要的话, 应用程序可以替换
    这个配置。

基本曰志

要生成简单的日志记录,可以使用全局日志记录器(global logger) 并调用其 info 方法:

Logger.getClobal 0,info("File->Open menu item selected");

在默认情况下,这条记录将会显示以下内容:

May 10, 2013 10:12:15 PM LogginglmageViewer fileOpen
INFO: File->0pen menu item selected

但是, 如果在适当的地方(如 main 开始)调用

Logger.getClobal ().setLevel (Level .OFF);

将会取消所有的日志。

API:java.util.logging

高级曰志

从前面已经看到“ 虚拟日志”,下面继续看一下企业级( industrial-strength) 日志。在一个专业的应用程序中,不要将所有的日志都记录到一个全局日志记录器中,而是可以自定义日志记录器。

可以调用 getLogger 方法创建或获取记录器:

private static final Logger myLogger = Logger.getLogger("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);

日志记录说明

日志记录常用的操作:

  • 1 ) 为一个简单的应用程序, 选择一个日志记录器,并把日志记录器命名为与主应用程序包一样的名字,例如,com.mycompany.myprog。

可以通过调用下列方法得到日志记录器:

Logger logger = Logger.getLogger("com.mycompany.myprog");

为了方便,可以利用一些日志操作将下面的静态域添加到类中:

private static final Logger logger = Logger.getLogger("com.mycompany.nyprog"):
  • 2 ) 默认的日志配置将级别等于或高于 INFO 级别的所有消息记录到控制台。用户可以覆盖默认的配置文件。但是正如前面所述,改变配置需要做相当多的工作。因此,最好在应用程序中安装一个更加适宜的默认配置。

下列代码确保将所有的消息记录到应用程序特定的文件中。可以将这段代码放置在应用程序的 main方法中。

if (System,getProperty("java,util.logging.config.dass") == null
&& System.getPropertyC'java.util.logging.config.file") == null) {
try
{
   Logger.getLogger("").setLevel(Level.ALL);
   final int L0C_R0TATI0N_C0UNT = 10;
   Handler handler = new FileHandler('Wmyapp.log", 0, L0G_R0TATI0N_C0UNT):
   Logger.getLogger("").addHandler(handler): }
catch (IOException e) {
  logger.log(Level.SEVERE, "Can't create log file handler", e); 
  }
  }
  • 3 ) 现在,可以记录自己想要的内容了。但需要注意:所有级别为 INFO、 WARNING 和SEVERE 的消息都将显示到控制台上。因此, 最好只将对程序用户有意义的消息设置为这几个级别。将程序员想要的日志记录,设定为 FINE 是一个很好的选择。

当调用 System.out.println 时, 实际上生成了下面的日志消息:

logger.fine("File open dialog canceled";

记录那些不可预料的异常也,例如:

try
{}
catch (SonreException e) {
   logger,log(Level.FINE, "explanation", e); 
  }

调试技巧

在Intellij IDEA中使用Debug

how2j.java:如何在Eclipse中调试Java程序

W3Cschool:jUnit教程

Spring Boot干货系列:(十二)Spring Boot使用单元测试


参考:

【1】:《Java核心技术 卷一》

【2】:廖雪峰的官方网站:使用断言

【3】:廖雪峰的官方网站:使用JDK Logging

【4】:廖雪峰的官方网站:使用Commons Logging

【5】:廖雪峰的官方网站:使用Log4j

【6】:廖雪峰的官方网站:使用SLF4J和Logback

【7】:how2j.java: Log4j系列教材


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
10天前
|
Java 开发者
Java中的异常处理:从基础到高级
在Java编程的世界里,异常处理是一块基石,它确保了程序的健壮性和稳定性。本文将带你从异常的基础概念出发,逐步深入到高级处理技巧,通过实例展示如何在Java中有效管理和处理异常。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
9天前
|
Java 程序员
Java编程中的异常处理:从基础到高级
在Java的世界中,异常处理是代码健壮性的守护神。本文将带你从异常的基本概念出发,逐步深入到高级用法,探索如何优雅地处理程序中的错误和异常情况。通过实际案例,我们将一起学习如何编写更可靠、更易于维护的Java代码。准备好了吗?让我们一起踏上这段旅程,解锁Java异常处理的秘密!
|
6天前
|
Java
Java 异常处理:11 个异常处理最佳实践
本文深入探讨了Java异常处理的最佳实践,包括早抛出晚捕获、只捕获可处理异常、不忽略异常、抛出具体异常、正确包装异常、记录或抛出异常但不同时执行、不在finally中抛出异常、避免用异常控制流程、使用模板方法减少重复代码、抛出与方法相关的异常及异常处理后清理资源等内容,旨在提升代码质量和可维护性。
|
9天前
|
安全 Java 数据库连接
Java中的异常处理:理解与实践
在Java的世界里,异常处理是维护代码健壮性的守门人。本文将带你深入理解Java的异常机制,通过直观的例子展示如何优雅地处理错误和异常。我们将从基本的try-catch结构出发,探索更复杂的finally块、自定义异常类以及throw关键字的使用。文章旨在通过深入浅出的方式,帮助你构建一个更加稳定和可靠的应用程序。
21 5
|
7天前
|
Java 程序员
深入理解Java异常处理机制
Java的异常处理是编程中的一块基石,它不仅保障了代码的健壮性,还提升了程序的可读性和可维护性。本文将深入浅出地探讨Java异常处理的核心概念、分类、处理策略以及最佳实践,旨在帮助读者建立正确的异常处理观念,提升编程效率和质量。
|
8天前
|
Java 开发者 UED
深入探索Java中的异常处理机制##
本文将带你深入了解Java语言中的异常处理机制,包括异常的分类、异常的捕获与处理、自定义异常的创建以及最佳实践。通过具体实例和代码演示,帮助你更好地理解和运用Java中的异常处理,提高程序的健壮性和可维护性。 ##
26 2
|
8天前
|
Java 开发者
Java中的异常处理机制深度剖析####
本文深入探讨了Java语言中异常处理的重要性、核心机制及其在实际编程中的应用策略,旨在帮助开发者更有效地编写健壮的代码。通过实例分析,揭示了try-catch-finally结构的最佳实践,以及如何利用自定义异常提升程序的可读性和维护性。此外,还简要介绍了Java 7引入的多异常捕获特性,为读者提供了一个全面而实用的异常处理指南。 ####
25 2
|
8天前
|
Java 开发者
Java 中的异常处理:不仅仅是 try-catch
在Java的世界里,异常处理是代码的守护神,它保护着程序不会因为意外错误而崩溃。但异常处理远不止try-catch那么简单。本文将深入探讨Java的异常处理机制,从基本的try-catch到更复杂的自定义异常和finally块的使用,带你理解如何在Java中优雅地处理错误。
32 1
|
11天前
|
Java 程序员 UED
深入理解Java中的异常处理机制
本文旨在揭示Java异常处理的奥秘,从基础概念到高级应用,逐步引导读者掌握如何优雅地管理程序中的错误。我们将探讨异常类型、捕获流程,以及如何在代码中有效利用try-catch语句。通过实例分析,我们将展示异常处理在提升代码质量方面的关键作用。
24 3
|
6天前
|
Java API 开发者
深入理解Java中的异常处理机制
本文探讨了Java编程语言中异常处理的核心概念,包括异常类型、异常捕获与抛出、以及最佳实践。通过分析常见的异常场景和处理策略,旨在帮助开发者更好地理解和运用异常处理机制,提高代码的健壮性和可维护性。文章不仅涵盖了基本的try-catch结构,还深入讨论了自定义异常的创建与使用,以及finally块的重要性和应用。此外,还将介绍一些高级技巧,如多异常捕获和嵌套异常处理,为读者提供全面的技术指导。
48 0