* [异常对象的常用方法(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)** 绝无套路!!