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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 【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)**
绝无套路!!


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
3天前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
|
4天前
|
IDE 前端开发 Java
怎样避免 Java 中的 NoSuchFieldError 异常
在Java中避免NoSuchFieldError异常的关键在于确保类路径下没有不同版本的类文件冲突,避免反射时使用不存在的字段,以及确保所有依赖库版本兼容。编译和运行时使用的类版本应保持一致。
|
6天前
|
Java 编译器
如何避免在 Java 中出现 NoSuchElementException 异常
在Java中,`NoSuchElementException`通常发生在使用迭代器、枚举或流等遍历集合时,尝试访问不存在的元素。为了避免该异常,可以在访问前检查是否有下一个元素(如使用`hasNext()`方法),或者使用`Optional`类处理可能为空的情况。正确管理集合边界和条件判断是关键。
|
9天前
|
Java
Java异常捕捉处理和错误处理
Java异常捕捉处理和错误处理
11 1
|
10天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
26 2
|
17天前
|
Java
如何在 Java 中处理“Broken Pipe”异常
在Java中处理“Broken Pipe”异常,通常发生在网络通信中,如Socket编程时。该异常表示写入操作的另一端已关闭连接。解决方法包括:检查网络连接、设置超时、使用try-catch捕获异常并进行重试或关闭资源。
|
20天前
|
存储 安全 Java
如何避免 Java 中的“ArrayStoreException”异常
在Java中,ArrayStoreException异常通常发生在尝试将不兼容的对象存储到泛型数组中时。为了避免这种异常,确保在操作数组时遵循以下几点:1. 使用泛型确保类型安全;2. 避免生类型(raw types)的使用;3. 在添加元素前进行类型检查。通过这些方法,可以有效防止 ArrayStoreException 的发生。
|
21天前
|
人工智能 Oracle Java
解决 Java 打印日志吞异常堆栈的问题
前几天有同学找我查一个空指针问题,Java 打印日志时,异常堆栈信息被吞了,导致定位不到出问题的地方。
30 2
|
24天前
|
Java 索引
如何避免在 Java 中引发`StringIndexOutOfBoundsException`异常
在Java中,处理字符串时若访问了不存在的索引,会抛出`StringIndexOutOfBoundsException`异常。为避免此异常,应确保索引值在有效范围内,例如使用`length()`方法检查字符串长度,并确保索引值不小于0且不大于字符串长度减1。