技术日志2023-5-15

文章介绍了Java中List操作的一些注意事项,包括:1)尝试移除不存在元素不会报错;2)Arrays.asList创建的列表不支持add和remove操作,会抛出UnsupportedOperationException;3)增强for循环对null列表操作会引发NullPointerException;4)使用Optional避免空指针异常;5)MessageFormat用于格式化字符串输出。此外,文章强调了代码优化在开发过程中的重要性。

1、list直接remove不存在的值不会报错

public static void test1() {
    List<String> list = new ArrayList<>();
    list.add("1");
    list.add("2");

    // 删除不存在的元素,返回false
    System.out.println(list.remove("3"));
    // 删除存在的元素,返回true
    System.out.println(list.remove("1"));
}
这里有一个有趣的bug:

使用 Arrays.asList(“1”,“2”); 创建的list使用 removeadd 方法会报错 java.lang.UnsupportedOperationException

代码块:

public static void test2() {
    List<String> list = Arrays.asList("1", "2", "3");
    System.out.println(list.remove("3"));
    System.out.println(list.remove("1"));
    list.add("3");
    System.out.println(list);
}

执行结果:

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.remove(AbstractList.java:161)
	at java.util.AbstractList$Itr.remove(AbstractList.java:374)
	at java.util.AbstractCollection.remove(AbstractCollection.java:293)
	at com.wqguo.list.Demo.test2(Demo.java:34)
	at com.wqguo.list.Demo.main(Demo.java:13)

原因如下:
调用Arrays.asList()产生的List中的add、remove方法报异常,是因为Arrays.asList()返回的List实现类是自己内部实现的ArrayList,不是我们常用的java.util.ArrayList。Arrays的内部类ArrayList和java.util.ArrayList都是继承AbstractList,但是在Arrays的内部类ArrayList中没有重写AbstractList的add和remove方法。

AbstractList中add和remove方法都是默认throw UnsupportedOperationException的。

2、增强for循环如果list为null会报java.lang.NullPointerException

public static void main(String[] args) {
    List<String> list = null;
    for (String s : list) {
        System.out.println("jksdlf");
    }

    // 可以使用这种代码替换
    Optional.ofNullable(list).orElse(new ArrayList<>()).forEach(s->{
        System.out.println("jlskjdlfk");
    });
}

3、判断多个String类型参数任意为空时可以使用StringUtils.isAnyBlank()方法

public static void main(String[] args) {
    String mobile = "";
    String name = "jslkdf";
    System.out.println(StringUtils.isAnyBlank(mobile, name));
}

4、利用Optional来解决list为空产生NullPointerException

利用optional就可以不用判断list是否为空

Optional.ofNullable(list).orElse(new ArrayList<>()).stream().collect(Collectors.toList());

5、利用MessageFormat来格式化字符串的输出

public static String test1() {
    String USER_APP_SMS_CAPTCHA_KEY = "app:captcha:{0}:{1}";

    String mobile = "11111111";
    Integer type = 1;


    String format = MessageFormat.format(USER_APP_SMS_CAPTCHA_KEY, mobile, type);
    return format;
}

6、在工作中开发尽量在测试前将代码优化好

不然前期没有优化代码,最后自己都不敢去改了,本来没有bug的代码容易改出代码。

日志格式的设计是构建高效、可维护的日志系统的关键环节。一个良好的日志格式应当具备结构化、标准化和可读性强的特点,便于后续的日志解析、分析和监控。 ### 示例日志格式 以下是一个结构化的日志格式示例,包含时间戳、日志级别、项目信息、问题描述、控制信息等字段: ```json { "timestamp": "2024-04-05T14:30:45.123Z", "level": "ERROR", "project": "IntrusionDetectionSystem", "module": "SerialCommunication", "description": "Database connection timeout", "details": { "device_id": "COM3", "timeout_duration": "5000ms", "retry_attempts": 3 }, "status": "Failed", "control": { "action_taken": "Reconnect attempt", "next_retry": "2024-04-05T14:30:50.123Z" } } ``` ### 字段说明 - **`timestamp`**:时间戳用于标识日志记录的具体时间,通常采用ISO 8601格式,确保跨系统时间的统一性。 - **`level`**:日志级别用于区分日志的重要程度,常见的日志级别包括 `DEBUG`、`INFO`、`WARNING`、`ERROR` 和 `FATAL`。 - **`project`**:标识日志所属的项目或系统名称,便于日志分类管理。 - **`module`**:描述日志产生的模块或组件,例如串口通信模块、数据库连接模块等。 - **`description`**:简要描述发生的事件,例如“数据库连接超时”、“通信中断”等。 - **`details`**:包含与问题相关的详细信息,如设备ID、超时时间、重试次数等。 - **`status`**:表示操作的结果状态,如“成功”或“失败”。 - **`control`**:用于记录系统采取的控制动作,如重连尝试、下一次重试时间等,便于后续自动化处理。 ### 日志系统的结构设计 在设计日志系统时,建议采用以下层次结构: 1. **采集层**:负责从各个模块或设备中收集日志数据,支持多种日志格式(如文本、JSON)。 2. **传输层**:将采集到的日志数据通过网络传输到集中式日志服务器,可使用 TCP、UDP 或消息队列(如 Kafka、RabbitMQ)。 3. **存储层**:将日志数据存储到数据库或日志管理系统中,如 Elasticsearch、MongoDB 或 HDFS。 4. **分析层**:对日志进行实时或离线分析,识别异常模式、统计指标等。 5. **展示层**:通过可视化工具(如 Kibana、Grafana)展示日志数据,支持告警、报表等功能。 ### 日志系统在异物入侵检测中的应用 在一个异物入侵检测系统中,日志格式可以包括以下关键字段: ```json { "timestamp": "2024-04-05T15:00:00.000Z", "level": "INFO", "project": "IntrusionDetectionSystem", "module": "SensorMonitoring", "description": "Foreign object detected", "sensor_id": "SENSOR_001", "location": "Zone A", "action": "Alert triggered", "status": "Active" } ``` - **`sensor_id`**:标识触发日志的传感器编号。 - **`location`**:描述传感器所在的物理位置,如“Zone A”。 - **`action`**:记录系统采取的动作,如“告警触发”。 - **`status`**:表示当前状态,如“Active”或“Resolved”。 通过结构化日志设计,可以有效提升日志的可读性和可分析性,为系统的故障排查、性能优化和安全审计提供有力支持。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值