java 断言 异常_Java 异常与断言

异常与断言

在理想世界里,用户输入数据的格式永远都是正确的,代码永远不会出现bug,然而,在现实世界的开发过程中,总会遇到各种各样的问题,当然,我也可以说,这不是bug,而是特性~~~

言归正传,如果由于程序的错误导致用户所做的工作统统丢失,那用户可能就再也不会用它了。为了避免这样的情况,至少应该做到以下几点向用户通知错误

保存所有的工作

允许用户妥善地退出程序

1. 处理错误

为了能够处理程序中的异常情况,必须考虑到程序中可能会出现的错误和问题。比如:用户输入错误

设备错误

物理限制

代码错误

1.1 异常分类

在Java中,异常对象都是派生于Throwable类的一个实例。在下一层分解为两个分支,Error和Exception。 Error描述了Java运行时系统的内部错误和资源耗尽错误 Exception又分解为两个分支 由编程错误导致的RuntimeException,比如错误的强制类型转换,数组访问越界等 由I/O错误导致的其他异常IOException,比如试图打开一个不存在的文件等 如下图所示是异常层次结构的一个示意图

Tip如果出现RuntimeException,那么一定是你的问题

Java将派生于Error类或RuntimeException类的所有异常称为非检查型(unchecked),所有其他异常称为检查型(checked)

1.2 如何抛出异常

假设我们正在读取一个文件,预期读取1024个字符,但是在读到500个字符的时候文件就结束了,出现了问题,我们希望抛出一个EOFException,即输入过程中意外遇到了EOF。

String readData(Scanner in) throws EOFException {

// blablabla if (!in.hasNext()) {

if (n < len) {

throw new EOFException();

}

}

}

1.3 创建异常类

如果我们遇到了标准异常类无法描述清楚的问题,可以自己创建异常类。我们可以定义一个派生于Exception的类,或者某个Exception的子类,比如IOException。

class FileFormatException extends IOException {

public FileFormatException() {}

public FileFormatException(String gripe) {

super(gripe);

}

}

2. 捕获异常

要想捕获一个异常,需要设置try/catch块。

try {

// blablabla} catch (Exception e) {

// blablabla}

如果try语句块中的代码抛出了catch子句中指定的一个类,那么程序将跳过try语句块中的其余代码,并执行catch语句块中的代码。如果try中的代码没有异常,那么程序就会跳过catch语句。

2.1 finally子句

代码抛出一个异常时,就会停止处理这个方法中的剩余代码,但是如果这个方法中存在一些资源需要被清理,就会产生问题。 finally子句不管异常有没有被捕获,都会执行。比如下面的例子,所有情况下都会程序都会关闭输入流。

FileInputStream in = new FileInputStream();

try {

// blablabla}

catch (IOException e) {

// blablabla}

finally {

in.close();

}

2.2 try-with-resources语句

对于文件操作IO流、数据库连接等开销非常昂贵的资源,用完之后必须及时通过close方法将其关闭,否则资源会一直处于打开状态,可能会导致内存泄露等问题。关闭资源的常用方式就是在finally块里是释放,即调用close方法。就像我们在2.1节中的例子一样,但是从java7开始,我们可以使用一种更好的方法try-with-resources语句来实现。它的形式如下

try (Resources res = ...) {

// blablabla}

我们来看一个具体的例子,读取一个文件中的所有单词。

try (Scanner in = new Scanner(

new FileInputStream("/usr/share/dict/words"), StandardCharsets.UTF_8)) {

while (in.hasNext()) {

System.out.println(in.next());

}

}

3. 使用断言

断言机制允许在测试期间向代码中插入一些检查,而在生产代码中会自动删除这些检查。断言的关键字是assert。有以下两种形式

assert condition;

assert condition : expression;

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

默认情况下,断言是禁用的,需要在运行程序时用-ea启用断言。

参考:《Java核心技术 卷I》

### 使用阿里云 Docker 部署前后端分离项目 #### 环境准备 为了在阿里云使用 Docker 部署包含前端和后端的项目,首先需要准备好相应的环境。这包括获取一台合适的云服务器并完成必要的软件安装。 对于云服务器的选择,可以考虑使用阿里云轻量级应用服务器作为部署平台[^1]。一旦选择了适合的实例规格,在创建完成后即可以通过 SSH 远程登录到该服务器进行后续操作。 #### 安装 Docker 及其依赖项 确保操作系统是最新的状态之后,通过以下命令来配置 Docker 的 YUM 源至阿里云镜像仓库,并安装最新版本的 Docker: ```bash sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io -y ``` 上述命令会将官方源替换为更快速稳定的国内镜像站点,从而加速下载过程;接着执行 `yum` 命令完成实际的安装工作[^3]。 #### 启动与管理 Docker 服务 安装完毕后应当立即启用 Docker 自启功能以便于未来维护更加便捷高效: ```bash sudo systemctl start docker sudo systemctl enable docker ``` 这样即使重启机器也不必担心容器化应用程序无法正常运行了。 #### 构建或拉取所需镜像 针对具体的业务需求分别构建或者从公共注册表中拉取对应的前端、后端以及数据库组件所需的 Docker 镜像文件。例如 Spring Boot 应用程序通常会被打包成 JAR 文件并通过官方 Java Base Image 来启动;而 MySQL 数据库则可以直接利用官方提供的稳定版镜像来进行初始化设置。 #### 编写 Compose 文件实现多容器编排 考虑到前后端分离架构的特点,推荐采用 Docker Compose 工具简化多个关联服务之间的协调运作关系。编写一份描述清晰合理的 YAML 格式的 compose 文件能够帮助自动化整个项目的搭建流程,减少人为干预带来的不确定性因素影响最终效果[^2]。 #### 测试验证部署成果 最后一步就是仔细检查各个部分是否按照预期那样协同合作良好地运转起来了——访问指定域名下的网页界面查看是否存在加载异常情况;尝试提交一些简单的交互请求确认后台逻辑处理无误等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值