java异常分类

异常主要分两类:

  • Error : 一般是指java虚拟机相关的问题,如系统崩溃、虚拟机出错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常应用程序无法处理这些错误,因此应用程序不应该捕获Error对象,也无须在其throws子句中声明该方法抛出任何Error或其子类。
  • Exception: 又分为受检异常和运行时异常;
    • 受检异常:Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。
    • 运行时异常:这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。不处理的情况下,要不线程中止,要么主程序终止
      在这里插入图片描述

throw & throws

throw 在方法体内使用,强调动作,一定会抛出异常,throw后面跟对象,或对象的引用;throw后如果有finally,会执行完finally再结束;
throws在函数名或者参数列表后使用,表明可能会抛出的异常;

NullPointerException处理原则

NullPointerException是一种代码逻辑错误,遇到NullPointerException,遵循原则是早暴露,早修复,严禁使用catch来隐藏这种编码错误:

好的编码习惯可以极大地降低NullPointerException的产生,例如:

  • 成员变量在定义时初始化:
    使用空字符串或空数组,而不是默认的null可避免很多NullPointerException,这样可以使得调用方无需检查结果是否为null。
public class Person {
    private String name = "";
}
public String[] readLinesFromFile(String file) {
    if (getFileSize(file) == 0) {
        // 返回空数组而不是null:
        return new String[0];
    }
    ...
}

如果调用方一定要根据null判断,比如返回null表示文件不存在,那么考虑返回Optional:这样调用方必须通过Optional.isPresent()判断是否有结果

public Optional<String> readFromFile(String file) {
    if (!fileExist(file)) {
        return Optional.empty();
    }
    ...
}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐