在开始之前,让我们高喊我们的口号:
键盘敲烂,年薪百万!
我听说关注我的人都已经暴富了!
目录
2.自己处理(捕获异常):目的是代码出现异常的时候,可以让程序继续运行下去。
异常是什么?
异常就是代表程序出现的问题。
我们学习异常不是为了防止异常出现,而是学习异常发生以后的处理措施
报错怎么看?简单来说就是看冒号
常见异常家族成员有哪些?
运行时异常(RuntimeException),在编译的时候不会异常,在运行时出现异常,例如:数组越界异常。
编译时异常:在编译阶段就会报异常,例如:日期解析异常。
java文件——>字节码文件(.class)——>运行结果
编译时异常就是在第一阶段出现的,只会检查语法是否错误以及做一些优化
运行时异在第二阶段出现,表示代码运行时候出现的异常。一般由数据传递错误导致。
异常作用有哪些?
- 用于检查查找bug
- 通知调用者底层执行的情况
异常处理方式
1.JVM默认处理方式
异常名称、原因、位置等显示在控制台,程序停止运行,不再执行下面的代码。异常是红色字体。
2.自己处理(捕获异常):目的是代码出现异常的时候,可以让程序继续运行下去。
一般用在调用处,能让代码继续运行。
格式:
try{
可能出现异常的代码;
} catch(异常类名 变量名){
异常的处理代码;
}
异常灵魂四问
1.灵魂一问:如果try中没有遇到问题,怎么执行?
会把try里面所有的代码全部执行完毕,不会执行catch里面的代码
2.灵魂二问:如果try中可能会出现多个问题,怎么执行?
会写多个catch与之对应,父类异常需要写在下面
3.灵魂三问:如果try中遇到的问题没有被捕获,怎么执行?
相当于try……catch白写了,当前异常会交给虚拟机处理
4.如果try中遇到了问题,那么try下面的其他代码还会执行吗?
不会执行。try中遇到问题,直接跳转到对应的catch,如果没有对应的catch与之匹配,则交给虚拟机处理。
灵魂一问:
public class ExceptionDemo7 {
/*
自己处理(捕获异常)灵魂四问:
灵魂一问:如果try中没有遇到问题,怎么执行?
会把try里面所有的代码全部执行完毕,不会执行catch里面的代码
注意:
只有当出现了异常才会执行catch里面的代码
*/
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6};
try {
System.out.println(arr[0]);//这里越界了,会打印"数组下标越界",然后再打印"看我执行了没?"
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组下标越界");
}
System.out.println("看我执行了没?");//执行了
}
}
灵魂二问:
public class ExceptionDemo8 {
public static void main(String[] args) {
/*
自己处理(捕获异常)灵魂四问:
灵魂二问:如果try中可能会遇到多个问题,怎么执行?
会写多个catch与之对应
细节:
如果我们要捕获多个异常,这些异常中如果存在父子关系的话,那么父类一定要写在下面
了解性:
在JDK7之后,我们可以在catch中同时捕获多个异常,中间用|进行隔开
表示如果出现了A异常或者B异常的话,采取同一种处理方案
*/
//JDK7
int[] arr = {1, 2, 3, 4, 5, 6};
try {
System.out.println(arr[10]);
System.out.println(2/0);
String s = null;
System.out.println(s.equals("abc"));
} catch (ArrayIndexOutOfBoundsException | ArithmeticException e) {
System.out.println("索引越界了");
}catch (NullPointerException e){
System.out.println("空指针异常");
}catch (Exception e){
System.out.println("异常");
}
System.out.println("看我执行了没?");//要执行。
// 最后的结果是:
// 索引越界了
//看我执行了没?
}
}
灵魂三问:
public class ExceptionDemo9 {
public static void main(String[] args) {
/*
自己处理(捕获异常)灵魂三问:
如果try中遇到的问题没有被捕获,怎么执行?
相当于try...catch的代码白写了,最终还是会交给虚拟机进行处理。
*/
int[] arr = {1,2,3,4,5,6};
try {
System.out.println(arr[10]);
} catch (NullPointerException e) {
System.out.println("空指针异常");//这里不会执行的,因为错误是ArrayIndexOutOfBoundsException
//new ArrayIndexOutOfBoundsException交给JVM虚拟机处理这个异常
}
System.out.println("看我执行了没?");
}
}
灵魂四问:
public class ExceptionDemo10 {
public static void main(String[] args) {
/*
自己处理(捕获异常)灵魂四问:
如果try中遇到了问题,那么try下面的其他代码还会执行吗?
下面的代码就不会执行了,直接跳转到对应的catch当中,执行catch里面的语句体
但是如果没有对应catch与之匹配,那么还是会交给虚拟机进行处理
*/
int[] arr = {1, 2, 3, 4, 5, 6, 7};
try {
System.out.println(arr[10]);
System.out.println("看我会执行吗?");//不会
} catch (IndexOutOfBoundsException e) {
System.out.println("数组下标越界");
}
}
}
3.抛出异常:
在方法中,出现异常了。方法就没有继续运行下去的意义了,采取抛出处理。让该方法结束运行并告诉调用者出现了问题。
throws
格式:
public void 方法() throws 异常类名1,异常类名2...{
...
}
注意:写在方法定义处,表示声明一个异常告诉调用者,使用本方法可能会有哪些异常。
throw
格式:
public void 方法(){
throw new NullPointerException();
}
注意:写在方法内,结束方法;手动抛出异常对象,交给调用者方法中下面的代码不再执行。
编译时异常:必须写。
运行时异常:可以不写。
public class ExceptionDemo12 {
public static void main(String[] args) {
/*
throws:写在方法定义处,表示声明一个异常。告诉调用者,使用本方法可能会有哪些异常。
throw :写在方法内,结束方法。手动抛出异常对象,交给调用者。方法中下面的代码不再执行了。
需求:
定义一个方法求数组的最大值s
*/
int[] arr =new int[0];
int max = 0;
try {
max = getMax(arr);
} catch (NullPointerException e) {
System.out.println("空指针异常");
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("数组下标越界");
}
}
public static int getMax(int[] arr) /*throws NullPointerException,ArrayIndexOutOfBoundsException*/{
if (arr == null) {
throw new NullPointerException();
}
if (arr.length == 0) {
throw new ArrayIndexOutOfBoundsException();
}
System.out.println("看我执行了嘛?");//这里不会执行
int max = 0;
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max){
max = arr[i];
}
}
return max;
}
}
异常中的常见方法
public class ExceptionDemo11 {
public static void main(String[] args) {
/*
public String getMessage() 返回此 throwable 的详细消息字符串
public String toString() 返回此可抛出的简短描述
public void printStackTrace() 在底层是利用System.err.println进行输出
把异常的错误信息以红色字体输出在控制台
细节:仅仅是打印信息,不会停止程序运行
*/
int[] arr = {1, 2, 3, 4, 5, 6};
/*
try {
System.out.println(arr[10]);
} catch (ArrayIndexOutOfBoundsException e) {
*/
/* String message = e.getMessage();
System.out.println(message);//Index 10 out of bounds for length 6*//*
*/
/* String str = e.toString();
System.out.println(str);//java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 6*//*
e.printStackTrace();
}
System.out.println("看看我执行了吗?");*/
//正常的输出语句
//System.out.println(123);
//错误的输出语句(而是用来打印错误信息)
System.err.println(123);
}
}
好今天的分享就到这里
欢迎在评论区交流
一起学习,一起进步!
如果你能关注我
那就是对我创作的最大鼓励啦!