【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://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)**

绝无套路!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值