先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
2.1 Throwable 类
Throwable
位于 java.lang
包下,它是 Java 语言中所有错误(Error
)和异常(Exception
)的父类。
Throwable
包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace()
等接口用于获取堆栈跟踪数据等信息。
主要方法:
-
fillInStackTrace
: 用当前的调用栈层次填充Throwable
对象栈层次,添加到栈层次任何先前信息中; -
getMessage
:返回关于发生的异常的详细信息。这个消息在Throwable
类的构造函数中初始化了; -
getCause
:返回一个Throwable
对象代表异常原因; -
getStackTrace
:返回一个包含堆栈层次的数组。下标为 0 的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底; -
printStackTrace
:打印toString()
结果和栈层次到System.err
,即错误输出流。
2.2 Error 类
Error
是 Throwable
的一个直接子类,它可以指示合理的应用程序不应该尝试捕获的严重问题。这些错误在应用程序的控制和处理能力之外,编译器不会检查 Error
,对于设计合理的应用程序来说,即使发生了错误,本质上也无法通过异常处理来解决其所引起的异常状况。
常见 Error
:
-
AssertionError
:断言错误; -
VirtualMachineError
:虚拟机错误; -
UnsupportedClassVersionError
:Java 类版本错误; -
OutOfMemoryError
:内存溢出错误。
2.3 Exception 类
Exception
是 Throwable
的一个直接子类。它指示合理的应用程序可能希望捕获的条件。
Exception
又包括 Unchecked Exception
(非检查异常)和 Checked Exception
(检查异常)两大类别。
2.3.1 Unchecked Exception (非检查异常)
Unchecked Exception
是编译器不要求强制处理的异常,包含 RuntimeException
以及它的相关子类。我们编写代码时即使不去处理此类异常,程序还是会编译通过。
常见非检查异常:
-
NullPointerException
:空指针异常; -
ArithmeticException
:算数异常; -
ArrayIndexOutOfBoundsException
:数组下标越界异常; -
ClassCastException
:类型转换异常。
2.3.2 Checked Exception(检查异常)
Checked Exception
是编译器要求必须处理的异常,除了 RuntimeException
以及它的子类,都是 Checked Exception
异常。我们在程序编写时就必须处理此类异常,否则程序无法编译通过。
常见检查异常:
-
IOException
:IO 异常 -
SQLException
:SQL 异常
在 Java 语言中,异常处理机制可以分为两部分:
-
抛出异常:当一个方法发生错误时,会创建一个异常对象,并交给运行时系统处理;
-
捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器。
Java 通过 5 个关键字来实现异常处理,分别是:throw
、throws
、try
、catch
、finally
。
异常总是先抛出,后捕获的。下面我们将围绕着 5 个关键字来详细讲解如何抛出异常以及如何捕获异常。
4.1 实例
我们先来看一个除零异常的实例代码:
package com.caq.exception;
public class Demo01 {
//打印a/b的结果
public static void test(int a,int b){
System.out.println(a/b);
}
public static void main(String[] args) {
//调用test方法
test(5,0);
}
}
运行结果:
Exception in thread “main” java.lang.ArithmeticException: / by zero
at com.caq.exception.Demo01.test(Demo01.java:6)
at com.caq.exception.Demo01.main(Demo01.java:11)
Process finished with exit code 1
我们知道 0
是不能用作除数的,由于 test()
方法中除数 b
为 0
,所以代码将停止执行并显示了相关的异常信息,此信息为堆栈跟踪
上面的运行结果告诉我们:main
线程发生了类型为 ArithmeticException
的异常,显示消息为 by zero
,并且提示了可能发生异常的方法和行号。
4.2 throw
上面的实例中,程序在运行时引发了错误,那么如何来显示抛出(创建)异常呢?
我们可以使用 throw
关键字来抛出异常,throw
关键字后面跟异常对象,改写上面的实例代码:
package com.caq.exception;
public class Demo01 {
//打印a/b的结果
public static void test(int a,int b){
if (b==0){
//抛出异常
throw new ArithmeticException(“被除数不能为零”);
}
System.out.println(a/b);
}
public static void main(String[] args) {
//调用test方法
test(5,0);
}
}
运行结果:
Exception in thread “main” java.lang.ArithmeticException: 被除数不能为零
at com.caq.exception.Demo01.test(Demo01.java:8)
at com.caq.exception.Demo01.main(Demo01.java:15)
代码在运行时同样引发了错误,但显示消息为 “除数不能为零”。我们看到 test()
方法中加入了条件判断,如果调用者将参数 b
设置为 0
时,会使用 throw
关键字来抛出异常,throw 后面跟了一个使用 new
关键字实例化的算数异常对象,并且将消息字符串作为参数传递给了算数异常的构造函数。
我们可以使用 throw
关键字抛出任何类型的 Throwable
对象,它会中断方法,throw
语句之后的所有内容都不会执行。除非已经处理抛出的异常。异常对象不是从方法中返回的,而是从方法中抛出的。
4.3 throws
可以通过 throws
关键字声明方法要抛出何种类型的异常。如果一个方法可能会出现异常,但是没有能力处理这种异常,可以在方法声明处使用 throws
关键字来声明要抛出的异常。例如,汽车在运行时可能会出现故障,汽车本身没办法处理这个故障,那就让开车的人来处理。
throws
用在方法定义时声明该方法要抛出的异常类型,如下是伪代码:
public void demoMethod() throws Exception1, Exception2, … ExceptionN {
// 可能产生异常的代码
}
throws
后面跟的异常类型列表可以有一个也可以有多个,多个则以 ,
分割。当方法产生异常列表中的异常时,将把异常抛向方法的调用方,由调用方处理。
throws 有如下使用规则:
-
如果方法中全部是非检查异常(即
Error
、RuntimeException
以及的子类),那么可以不使用throws
关键字来声明要抛出的异常,编译器能够通过编译,但在运行时会被系统抛出; -
如果方法中可能出现检查异常,就必须使用
throws
声明将其抛出或使用try catch
捕获异常,否则将导致编译错误; -
当一个方法抛出了异常,那么该方法的调用者必须处理或者重新抛出该异常;
-
当子类重写父类抛出异常的方法时,声明的异常必须是父类所声明异常的同类或子类。
使用 try 和 catch 关键字可以捕获异常。try catch 代码块放在异常可能发生的地方。它的语法如下:
Tips:
再IDEA里可以通过//ctrl+alt+t选择代码自动包裹
try {
// 可能会发生异常的代码块
} catch (Exception e1) {
// 捕获并处理try抛出的异常类型Exception
} catch (Exception2 e2) {
// 捕获并处理try抛出的异常类型Exception2
} finally {
// 无论是否发生异常,都将执行的代码块
}
我们来看一下上面语法中的 3 种语句块:
-
try
语句块:用于监听异常,当发生异常时,异常就会被抛出; -
catch
语句块:catch
语句包含要捕获的异常类型的声明,当try
语句块发生异常时,catch
语句块就会被检查。当catch
块尝试捕获异常时,是按照catch
块的声明顺序从上往下寻找的,一旦匹配,就不会再向下执行。因此,如果同一个try
块下的多个catch
异常类型有父子关系,应该将子类异常放在前面,父类异常放在后面; -
finally
语句块:无论是否发生异常,都会执行finally
语句块。finally
常用于这样的场景:由于finally
语句块总是会被执行,所以那些在try
代码块中打开的,并且必须回收的物理资源(如数据库连接、网络连接和文件),一般会放在finally
语句块中释放资源。
try
语句块后可以接零个或多个 catch
语句块,如果没有 catch
块,则必须跟一个 finally
语句块。简单来说,try
不允许单独使用,必须和 catch
或 finally
组合使用,catch
和 finally
也不能单独使用。
实例如下:
package com.caq.exception;
public class Demo01 {
//打印a/b的结果
public static void test(int a,int b){
System.out.println(a/b);
}
public static void main(String[] args) {
//调用test方法
try {
test(5,0);
}catch (ArithmeticException e1){
System.out.println(“捕获的异常为:”+e1);
}finally {
System.out.println(“无论是否发送异常,我都会执行哦~”);
}
}
}
运行结果:
捕获的异常为:java.lang.ArithmeticException: / by zero
无论是否发送异常,我都会执行哦~
test()
方法中除数 b
为 0
,会发生除零异常,我们在方法调用处使用了 try
语句块对异常进行捕获;如果捕获到了异常, catch
语句块会对 ArithmeticException
类型的异常进行处理,此处打印了一行自定义的提示语句;
最后的 finally
语句块,无论发生异常与否,总会执行。
Java 7 以后,catch
多种异常时,也可以像下面这样简化代码:
try {
// 可能会发生异常的代码块
} catch (Exception | Exception2 e) {
// 捕获并处理try抛出的异常类型
} finally {
// 无论是否发生异常,都将执行的代码块
}
自定义异常,就是定义一个类,去继承 Throwable
类或者它的子类。
Java 内置了丰富的异常类,通常使用这些内置异常类,就可以描述我们在编码时出现的大部分异常情况。一旦内置异常无法满足我们的业务要求,就可以通过自定义异常描述特定业务产生的异常类型。
实例:
public class ExceptionDemo4 {
static class MyCustomException extends RuntimeException {
/**
- 无参构造方法
*/
public MyCustomException() {
super(“我的自定义异常”);
}
}
public static void main(String[] args) {
// 直接抛出异常
throw new MyCustomException();
}
}
运行结果:
Exception in thread “main” ExceptionDemo4$MyCustomException: 我的自定义异常
at ExceptionDemo4.main(ExceptionDemo4.java:13)
在代码中写了一个自定义异常 MyCustomException
,继承自 RuntimeException
,它是一个静态内部类,这样在主方法中就可以直接抛出这个异常类了。当然,也可以使用 catch
来捕获此类型异常。
异常链是以一个异常对象为参数构造新的异常对象,新的异常对象将包含先前异常的信息。简单来说,就是将异常信息从底层传递给上层,逐层抛出,我们来看一个实例:
public class ExceptionDemo5 {
/**
- 第一个自定义的静态内部异常类
*/
static class FirstCustomException extends Exception {
// 无参构造方法
public FirstCustomException() {
super(“第一个异常”);
}
}
/**
- 第二个自定义的静态内部异常类
*/
static class SecondCustomException extends Exception {
public SecondCustomException() {
super(“第二个异常”);
}
}
/**
- 第三个自定义的静态内部异常类
*/
static class ThirdCustomException extends Exception {
public ThirdCustomException() {
super(“第三个异常”);
}
}
/**
-
测试异常链静态方法1,直接抛出第一个自定义的静态内部异常类
-
@throws FirstCustomException
*/
public static void f1() throws FirstCustomException {
throw new FirstCustomException();
}
/**
-
测试异常链静态方法2,调用f1()方法,并抛出第二个自定义的静态内部异常类
-
@throws SecondCustomException
*/
public static void f2() throws SecondCustomException {
try {
f1();
} catch (FirstCustomException e) {
throw new SecondCustomException();
}
}
/**
-
测试异常链静态方法3,调用f2()方法, 并抛出第三个自定义的静态内部异常类
-
@throws ThirdCustomException
*/
public static void f3() throws ThirdCustomException {
try {
f2();
} catch (SecondCustomException e) {
throw new ThirdCustomException();
}
}
public static void main(String[] args) throws ThirdCustomException {
// 调用静态方法f3()
总结
以上是字节二面的一些问题,面完之后其实挺后悔的,没有提前把各个知识点都复习到位。现在重新好好复习手上的面试大全资料(含JAVA、MySQL、算法、Redis、JVM、架构、中间件、RabbitMQ、设计模式、Spring等),现在起闭关修炼半个月,争取早日上岸!!!
下面给大家分享下我的面试大全资料
- 第一份是我的后端JAVA面试大全
后端JAVA面试大全
- 第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
- 第三份是Spring全家桶资料
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
tion {
// 调用静态方法f3()
总结
以上是字节二面的一些问题,面完之后其实挺后悔的,没有提前把各个知识点都复习到位。现在重新好好复习手上的面试大全资料(含JAVA、MySQL、算法、Redis、JVM、架构、中间件、RabbitMQ、设计模式、Spring等),现在起闭关修炼半个月,争取早日上岸!!!
下面给大家分享下我的面试大全资料
- 第一份是我的后端JAVA面试大全
[外链图片转存中…(img-vNEHxjbi-1713614281014)]
后端JAVA面试大全
- 第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理
[外链图片转存中…(img-11QigR75-1713614281014)]
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
- 第三份是Spring全家桶资料
[外链图片转存中…(img-9bDB6X7x-1713614281015)]
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-CIIs5P3E-1713614281016)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!