* [异常对象的常用方法(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://img-blog.csdnimg.cn/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://img-blog.csdnimg.cn/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://img-blog.csdnimg.cn/20200421002355795.png)
[](https://gitee.com/vip204888/java-p7)finally
--------------------------------------------------------------------------
`try` 或 `catch` 正常执行完毕后,一定会执行 `finally` 中的代码:
* `finally` 可以和 `try-catch` 搭配使用,也可以只和 `try` 搭配使用
* 经常会在 `finally` 中编写一些关闭、释放资源 的代码(比如关闭文件)
![在这里插入图片描述](https://img-blog.csdnimg.cn/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://img-blog.csdnimg.cn/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://img-blog.csdnimg.cn/20200421004610249.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)
**常见的非检查型异常 – Error**
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200421004701624.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)
**常见的非检查型异常 – RuntimeException**
![在这里插入图片描述](https://img-blog.csdnimg.cn/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://img-blog.csdnimg.cn/img_convert/5669ddc5abed213ce927b6d1a625ce88.png)
Mysql面试题汇总(一)
![Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计](https://img-blog.csdnimg.cn/img_convert/6cee08a99c55ca54a2f0f212f417c88e.png)
Mysql面试题汇总(二)
![Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计](https://img-blog.csdnimg.cn/img_convert/3999782bae7d7e712014206e3b6e0a22.png)
Redis常见面试题汇总(300+题)
![Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计](https://img-blog.csdnimg.cn/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)**
绝无套路!!