Java编程中的断言、异常与日志处理
立即解锁
发布时间: 2025-08-18 02:21:32 阅读量: 4 订阅数: 15 

### Java 编程中的断言、异常与日志处理
#### 1. 静态方法重载与编译问题
在 Java 编程里,有这样一个代码示例:
```java
class Baseclass {
public static void print(int i) {
System.out.println(i);
}
}
class Superclass extends Baseclass {
public static void print(long l) {
System.out.println(l);
}
}
```
这个示例在添加静态修饰符后能正常编译,然而相关规范并未对实例方法和类方法加以区分。在 1.4.2 FCS 版本中,这个问题会得到修复,届时适用方法的声明类将不再是重载方法匹配算法的一部分,这种“异常”情况会变为正常行为。
#### 2. 值集转换
值集转换与不同的浮点模式相关。每种浮点模式都有不同的“值集”:
| 浮点模式 | 值集 |
| ---- | ---- |
| 默认浮点模式 | float 和 double 值集 |
| FP - 严格浮点模式 | float - 和 double - 扩展指数值集 |
值集转换在 JVMS 中的定义是“将浮点值从一个值集映射到另一个值集而不改变其类型的过程”。它是单向转换,例如从 float - 扩展指数值集到 float 值集,或从 double - 扩展指数值集到 double 值集。不过,主流商业应用程序员通常无需关注值集转换,因为它可能导致的浮点溢出或下溢所涉及的数值,在主流商业应用中极少出现。
#### 3. 断言、异常与日志的关系
当断言中的布尔表达式为 false 时,会抛出 AssertionError,这也是断言和异常在同一章节讨论的原因。同时,异常处理和日志记录也密切相关。有三个部分的内容颇具争议:
- **Throwable 类层次结构**:认为错误的基本定义发生了范式转变,这是整个章节的核心。
- **Chicken Little “天要塌了”问题**:主张除系统初始化阶段外,不应使用错误来关闭应用程序。
- **通用异常处理程序**:认为 catch(Throwable e) 应作为首选的通用异常处理程序。
这里还提到了 SystemConfigurationError,它并非 java.lang 包中的标准错误类,而是建议添加到核心 API 中的 Error 子类,用于在 Java 产品或主机操作系统的类文件、资源束、系统属性等缺失时抛出。
#### 4. 断言的基本概念
使用 assert 关键字时,是在断言某个条件为真。若紧随 assert 关键字的布尔表达式为 false,则会抛出 AssertionError。AssertionError 是一种特殊的错误,因为负责的程序员或开发团队能完全控制导致该错误抛出的代码,所以在生产环境中可安全禁用断言。
#### 5. “完全控制”的含义
以参数检查和断言为例,在公共或受保护方法中,会进行参数检查,因为客户端或子类程序员可能会调用该方法;而在私有方法中,负责的程序员能完全控制;在包私有方法中,负责的程序员或开发团队能完全控制。例如 HashMap 类中的 resize 方法:
```java
void resize(int newCapacity) {
assert (newCapacity & -newCapacity) == newCapacity; //power of 2
…
}
```
该方法仅在 HashMap 和 LinkedHashMap 子类中被调用,调用时 capacity 总是 2 的幂次方,所以在 resize 方法中使用断言来测试 capacity 参数看似多余,但经验丰富的程序员明白测试假设的重要性。
#### 6. 断言的格式与类型
断言的一般格式为:
```
assert Expression1 : Expression2;
```
其中,Expression1 必须是布尔类型,是语法的必要部分;Expression2 可选,若断言失败,其值会传递给 AssertionError 构造函数。断言可分为简单断言和复杂断言:
- **简单断言**:除方法调用表达式之外的布尔类型表达式。
- **复杂断言**:调用方法的断言,方法的返回类型必须为布尔类型。例如 Thread 类中的 holdsLock 方法:
```java
assert Thread.holdsLock(obj);
```
#### 7. 断言的启用与禁用
在类加载的短暂期间,即超类初始化且 <clinit> 方法执行之前,断言始终启用。以下是一个示例:
```java
class Test extends Superclass {
public static void main(String[] args) {
assertionStatus();
}
static void assertionStatus() {
boolean assertionsEnabled = false;
assert assertionsEnabled = true; //intentional side effect
```
0
0
复制全文


