异常
异常的概述
首先我们需要明确异常就是代表程序出现的问题。学习它不是让我们以后不出异常,而是程序出了异常后我们该如何处理。
我们来看一下整个体系
我们先来讲一下Error,它代表系统级别的错误(属于严重错误),系统一旦出现问题,sum公司会把这些错误封装成Error对象,因此Error是给sun公司自己用的,我们开发人员不需要管他。
而与我们开发相关的东西就是Exception:叫做异常,代表程序可能存在的问题,我们通常会用Exception挤一挤他的子类来封装程序出现的问题。
异常又可以分为:运行时异常(RuntimeException及其子类,编译阶段不会出现异常提醒,而运行时出现的异常)和编译时异常(编译阶段就会出现异常提醒)
而异常又有两个作用。其一是用来查询bug的关键参考信息;其二在于异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
异常的处理方式
在Java中异常的处理方式主要有三种:1.JVM默认的处理方式 2.自己处理 3.抛出异常
JVM默认的处理方式
JVM默认的处理方式很简单,就是把异常的名称,异常原因及异常出现的位置等信息输出在了控制台,并且程序在此处停止执行,即异常位置下面的代码就不会再执行了
自己处理(捕获异常)
它的目的就是当发生异常时,能够让代码继续进行。我们先来用一段代码来简单演示一下:
public class 自己处理异常 {
public static void main(String[] args){
/*
自己处理异常
格式:
try{
可能出现异常的代码;
} catch(异常类名 变量名){
异常处理代码;
}
好处:可以让程序继续往下走,不会停止
*/
int[] arr={1,2,3,4,5,6};
try{
System.out.println(arr[10]); //此处出现了异常,程序就会在这创建一个对应异常的对象
System.out.println(2/0); //new ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e){
System.out.println("数组越界");
} catch (ArithmeticException e){
System.out.println("算数异常");
}
System.out.println("看看我执行了吗");
}
}
抛出处理
用一段代码来进行演示:
public class 抛出异常 {
public static void main(String[] args){
int[] arr=null;
try {
System.out.println(max(arr));
} catch (NullPointerException e) {
System.out.println("空指针异常");
} catch (IndexOutOfBoundsException e) {
System.out.println("索引越界异常");
}
}
public static int max(int[] arr){
if(arr==null){
System.out.println(123);
//手动创建一个异常对象,并把异常交给方法的调用者处理,此时方法就会结束,下面的代码就不会执行
throw new NullPointerException();
}
if(arr.length==0){
throw new IndexOutOfBoundsException();
}
int Max=arr[0];
for (int i = 0; i < arr.length; i++) {
if(arr[i]>Max){
Max=arr[i];
}
}
return Max;
}
}
throw与throws
throw与throws首先使用的位置不同,throws写于函数的后面跟的是异常类(可以是多个异常类),让使用者知道这里可能出现的异常,可以给出异常的处理方式。
而throw使用在函数内,后面跟的是具体的异常类型。throw抛出具体的异常类对象