【Java 异常,15套Java架构师百度云

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDSClaw,2核4GB
简介: 【Java 异常,15套Java架构师百度云


*   [异常对象的常用方法(getMessage、printStackTrace)](about:blank#getMessageprintStackTrace_161)
*   [finally](about:blank#finally_175)
*   [异常的种类(检查型异常、非检查型异常)](about:blank#_253)
*   [throws(作用、流程、细节)](about:blank#throws_273)
*   [throw](about:blank#throw_358)
*   [自定义异常(Exception、RuntimeException)](about:blank#ExceptionRuntimeException_381)
*   [使用异常的好处](about:blank#_434)
  • try-with-resources 语句
  • 练习 - 编写一个断言类

Java笔记目录可以点这里:Java 强化笔记

开发中的错误(语法错误、逻辑错误、异常)

=======================================================================================

在开发 Java 程序的过程中,会遇到各种各样的错误:

  • 语法错误
    会导致编译失败,程序无法正常运行
  • 逻辑错误
    比如需要执行加法操作时,不小心写成了减法操作
  • 运行时错误
    在程序运行过程中产生的意外,会导致程序终止运行
    在 Java 中也叫做异常

程序产生了异常,一般称之为:抛出了异常

  • 如果没有主动去处理它,会导致程序终止运行

例:如果【代码2】抛出了异常,并且没有主动去处理它,程序就会退出,【代码3】将没有机会执行。

pubilc staic void main(String[] args) {
  【代码1】
  【代码2】
  【代码3】
} 

思考:下面代码的打印结果是什么?

public static void main(String[] args) {
  System.out.println(1);
  Integer i1 = new Integer("123");
  System.out.println(2);
  Integer i2 = new Integer("abc");
  System.out.println(3);
} 

由于 "abc" 无法转换成整数,new Integer("abc") 会抛出一个异常:

  • 异常类型:java.lang.NumberFormatException
  • 由于没有主动去处理这个异常,所以导致程序终止运行

思考:下面代码的打印结果是什么?

public static void main(String[] args) {
  System.out.println(1);
  Integer i = new Integer("1234");
  Object obj = "1/2.34";
  Double d = (Double)obj;
  System.out.println(2);  
} 

由于 "12.34" 无法强转成 Double 类型,(Double)Object 会抛出一个异常

  • 异常类型:java.lang.ClassCastException
  • 由于没有主动去处理这个异常,所以导致程序终止运行

思考:下面代码的打印结果是什么?

public static void main(String[] args) {
  Integer[] nums = { 11, null, 22 };
  for (int num : nums) {
    System.out.println(num);
  }
} 

Integer 在自动拆箱为 int 时,会调用 Integer 对象的 inValue() 方法;

由于 nums[1]null,使用 null 调用方法会抛出一个异常

  • 异常类型:java.lang.NullPointerException
  • 由于没有主动去处理这个异常,所以导致程序终止运行

上面抛出异常的代码建议这么写:

Integer[] nums= { 11, null, 22 };
for (Integer num : nums) {
  System.out.println(num);
} 

打印的细节

Java 中直接打印 null 会报错;

但是有时候确实可以把 null 打印出来:

public class Dog {
  @Override
  public String toString() {
    return "Dog - 666";
  }
} 

Dog dog = new Dog();

System.out.println(dog); // Doge - 666

Dog dog2 = null;

System.out.println(dog2); // null

为什么 null 能被打印出来呢?可以看一下 `println` 的底层实现:发现调用了 `String.valueOf`

public void println(Object x) {

String s = String.valueOf(x);
synchronized (this) {
    print(s);
    newLine();
}

}

再看看 `String.valueOf`:可以发现打印出 null 其实是经过处理的。

public static String valueOf(Object obj) {

 return (obj == null) ? "null" : obj.toString();

}

[](https://gitee.com/vip204888/java-p7)异常(Exception)
================================================================================
Java 中有各种各样的异常
*   所有的异常最终都继承自 `java.lang.Throwable`  
    ![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20200421001042597.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)
如何防止程序因为抛出异常导致终止运行?
*   可以通过 `try-catch` 来捕捉处理异常
[](https://gitee.com/vip204888/java-p7)try-catch
----------------------------------------------------------------------------
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20200421001216366.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)  
**思考:下面代码的打印结果是什么?**

public static void main(String[] args) {

System.out.println(1);
try {
  System.out.println(2);
  Integer i = new Integer("abc");
  System.out.println(3);
} catch (NumberFormatException e) {
  System.out.println(4);
}
System.out.println(5);

}

1
2
4
5 
```
**一个 `catch` 捕获多种类型的异常**:
```
try {
} catch(异常A | 异常B | 异常 C) {
  // 当抛出【异常A】或【异常B】或【异常C】类型的异常时,会进入这个代码块
} 
```
*   从 Java 7 开始,单个 catch 可以捕获多种类型的异常
*   如果并列的几个异常类型之间存在父子关系,保留父类型即可
*   这里的变量 e 是隐式 final 的
[](https://gitee.com/vip204888/java-p7)异常对象的常用方法(getMessage、printStackTrace)
--------------------------------------------------------------------------------------------------------
```
try {
  Integer integer = new Integer("abc");
} catch (NumberFormatException e) {
  // 异常描述
  System.out.println(e.getMessage());
  // 异常名称 + 异常
  System.out.println(e);
  // 打印堆栈信息
  e.printStackTrace();
} 
```
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20200421002355795.png)
[](https://gitee.com/vip204888/java-p7)finally
--------------------------------------------------------------------------
`try` 或 `catch` 正常执行完毕后,一定会执行 `finally` 中的代码:
*   `finally` 可以和 `try-catch` 搭配使用,也可以只和 `try` 搭配使用
*   经常会在 `finally` 中编写一些关闭、释放资源 的代码(比如关闭文件)
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20200421002729899.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)  
`finally` 细节:  
如果在执行 `try` 或 `catch` 时,JVM 退出或者当前线程被中断、杀死
*   `finally` **可能不会执行**
如果 `try` 或 `catch` 中使用了 `return`、`break`、`continue` 等提前结束语句
*   `finally` **会在** `return`、`break`、`continue` **之前执行**
**思考:下面代码的打印结果是什么?**
```
for (int i = 1; i <= 3; i++) {
  try{
    System.out.println(i + "_try_1");
    if (i == 2) continue;
    System.out.println(i + "_try_2");
  } finally {
    System.out.println(i + "_finally");
  }
} 

1_try_1

1_try_2

1_finally

2_try_1

2_finally

3_try_1

3_try_2

3_finally

for (int i = 1; i <= 3; i++) {
  try{
    System.out.println(i + "_try_1");
    if (i == 2) break;
    System.out.println(i + "_try_2");
  } finally {
    System.out.println(i + "_finally");
  }
} 

1_try_1

1_try_2

1_finally

2_try_1

2_finally

public static void main(String[] args) {
  System.out.println(get());
}
static int get() {
  try {
    new Integer("abc");
    System.out.println(1);
    return 2;
  } catch (Exception e) {
    System.out.println(3);
    return 4;
  } finally {
    System.out.println(5);
  }
} 

3

5

4

[](https://gitee.com/vip204888/java-p7)异常的种类(检查型异常、非检查型异常)
--------------------------------------------------------------------------------------
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20200421004253994.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)  
**检查型异常**(Checked Exception)
*   这类异常一般难以避免,编译器**会**进行检查  
    如果开发者**没有**处理这类异常,编译器将**会**报错
*   哪些异常是检查型异常?  
    除 `Error`、`RuntimeException` 以外的异常
**非检查型异常**(Unchecked Exception)
*   这类异常一般可以避免,编译器**不会**进行检查  
    如果开发者**没有**处理这类异常,编译器将**不会**报错
*   哪些异常是非检查型异常?  
    `Error`、`RuntimeException`
**常见的检查型异常**:  
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20200421004610249.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)  
**常见的非检查型异常 – Error**  
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20200421004701624.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)  
**常见的非检查型异常 – RuntimeException**  
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20200421004716559.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)
[](https://gitee.com/vip204888/java-p7)throws(作用、流程、细节)
-----------------------------------------------------------------------------------
**`throws` 的作用**:将异常抛给上层方法

void test() throws FileNotFoundException, ClassNotFoundException {

PrintWriter out = new PrintWriter("F:/mj/520it.txt");
Class cls = Class.forName("Dog");

}

如果 `throws` 后面的异常类型存在父子关系,保留父类型即可

void test() throws Exception {

PrintWriter out = new PrintWriter("F:/mj/520it.txt");
Class cls = Class.forName("Dog");

}

void test() throws Throwable {
  PrintWriter out = new PrintWriter("F:/mj/520it.txt");
  Class cls = Class.forName("Dog");
### 那么如何才能正确的掌握Redis呢?
为了让大家能够在Redis上能够加深,所以这次给大家准备了一些Redis的学习资料,还有一些大厂的面试题,包括以下这些面试题
*   并发编程面试题汇总
*   JVM面试题汇总
*   Netty常被问到的那些面试题汇总
*   Tomcat面试题整理汇总
*   Mysql面试题汇总
*   Spring源码深度解析
*   Mybatis常见面试题汇总
*   Nginx那些面试题汇总
*   Zookeeper面试题汇总
*   RabbitMQ常见面试题汇总
JVM常频面试:
![Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计](https://ucc.alicdn.com/images/user-upload-01/img_convert/5669ddc5abed213ce927b6d1a625ce88.png)
Mysql面试题汇总(一)
![Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计](https://ucc.alicdn.com/images/user-upload-01/img_convert/6cee08a99c55ca54a2f0f212f417c88e.png)
Mysql面试题汇总(二)
![Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计](https://ucc.alicdn.com/images/user-upload-01/img_convert/3999782bae7d7e712014206e3b6e0a22.png)
Redis常见面试题汇总(300+题)
![Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计](https://ucc.alicdn.com/images/user-upload-01/img_convert/316837bcbe4e6ecc9eb1f18a6627101f.png)
**有需要的朋友,可以[直接点击这里免费获取](https://gitee.com/vip204888/java-p7)**
rowable {
  PrintWriter out = new PrintWriter("F:/mj/520it.txt");
  Class cls = Class.forName("Dog");
### 那么如何才能正确的掌握Redis呢?
为了让大家能够在Redis上能够加深,所以这次给大家准备了一些Redis的学习资料,还有一些大厂的面试题,包括以下这些面试题
*   并发编程面试题汇总
*   JVM面试题汇总
*   Netty常被问到的那些面试题汇总
*   Tomcat面试题整理汇总
*   Mysql面试题汇总
*   Spring源码深度解析
*   Mybatis常见面试题汇总
*   Nginx那些面试题汇总
*   Zookeeper面试题汇总
*   RabbitMQ常见面试题汇总
JVM常频面试:
[外链图片转存中...(img-M1fYtQSO-1628596318584)]
Mysql面试题汇总(一)
[外链图片转存中...(img-ENc0RhXG-1628596318586)]
Mysql面试题汇总(二)
[外链图片转存中...(img-nlZbKkZ4-1628596318588)]
Redis常见面试题汇总(300+题)
[外链图片转存中...(img-NlNBqjbW-1628596318590)]
**有需要的朋友,可以[直接点击这里免费获取](https://gitee.com/vip204888/java-p7)**
绝无套路!!


相关文章
|
6月前
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
607 8
|
8月前
|
消息中间件 Java 数据库
Java 基于 DDD 分层架构实战从基础到精通最新实操全流程指南
本文详解基于Java的领域驱动设计(DDD)分层架构实战,结合Spring Boot 3.x、Spring Data JPA 3.x等最新技术栈,通过电商订单系统案例展示如何构建清晰、可维护的微服务架构。内容涵盖项目结构设计、各层实现细节及关键技术点,助力开发者掌握DDD在复杂业务系统中的应用。
1546 0
|
8月前
|
机器学习/深度学习 人工智能 Java
Java 技术支撑下 AI 与 ML 技术融合的架构设计与落地案例分析
摘要: Java与AI/ML技术的融合为智能化应用提供了强大支持。通过选用Deeplearning4j、DJL等框架解决技术适配问题,并结合Spring生态和JVM优化提升性能。在金融风控、智能制造、医疗影像等领域实现了显著效果,如审批效率提升3倍、设备停机减少41%、医疗诊断延迟降低80%。这种技术融合推动了多行业的智能化升级,展现了广阔的应用前景。
585 0
|
8月前
|
消息中间件 Java Kafka
Java 事件驱动架构设计实战与 Kafka 生态系统组件实操全流程指南
本指南详解Java事件驱动架构与Kafka生态实操,涵盖环境搭建、事件模型定义、生产者与消费者实现、事件测试及高级特性,助你快速构建高可扩展分布式系统。
386 7
|
9月前
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
1007 0
|
9月前
|
缓存 Java 数据库
Java 项目分层架构实操指南及长尾关键词优化方案
本指南详解基于Spring Boot与Spring Cloud的Java微服务分层架构,以用户管理系统为例,涵盖技术选型、核心代码实现、服务治理及部署实践,助力掌握现代化Java企业级开发方案。
395 2
|
10月前
|
算法 架构师 Java
Java 开发岗及 java 架构师百度校招历年经典面试题汇总
以下是百度校招Java岗位面试题精选摘要(150字): Java开发岗重点关注集合类、并发和系统设计。HashMap线程安全可通过Collections.synchronizedMap()或ConcurrentHashMap实现,后者采用分段锁提升并发性能。负载均衡算法包括轮询、加权轮询和最少连接数,一致性哈希可均匀分布请求。Redis持久化有RDB(快照恢复快)和AOF(日志更安全)两种方式。架构师岗涉及JMM内存模型、happens-before原则和无锁数据结构(基于CAS)。
271 5
|
10月前
|
Java 程序员 数据库连接
我们详细地讲解一下 Java 异常及要如何处理
我是小假 期待与你的下一次相遇 ~
222 1
下一篇
开通oss服务