错误异常
1.空指针异常( NullPointerException)
引用对象为null
private static void test01() {
int[] arr = null;
System.out.println(arr[0]); //NullPointerException 空指针异常
}
2.数组角标越界异常( ArrayIndexOutOfBoundsException )
private static void test02() {
int[] arr = {1,2,3,4,5};
System.out.println(arr[6]); //ArrayIndexOutOfBoundsException
}
3.字符串角标越界异常( StringIndexOutOfBoundsException )
private static void test02() {
String s = "Hello";
System.out.println(s.charAt(10));
}
4.算数异常 (ArithmeticException)
private static void test03() {
System.out.println(10 / 0);//ArithmeticException
}
5.数字格式化异常( NumberFormatException)
private static void test03() {
int num = Integer.parseInt("abc"); //NumberFormatException
System.out.println(num);
}
6.栈内存溢出异常(StackOverflowError)——栈内存储存不下函数
private static void test04() {
show(); //StackOverflowError
}
7.堆内存溢出异常(OutOfMemoryError)——堆内存存储不下对象
private static void show() {
int[] arr = new int[10000000]; //OutOfMemoryError
show();
}
8.不支持克隆异常( CloneNotSupportedException)——被克隆的类必须实现Cloneable接口
private static void test05() {
ExceptionDemo01 demo01 = new ExceptionDemo01();
try {
demo01.clone(); //CloneNotSupportedException
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
在编写程序时,我们也要预判到可能会出错的问题,保证代码的正常运行,而不是
一报错就停止运行。
对预判到的错误进行标记
1.用错误代码进行标记
在调用函数时 根据返回的结果 来判断调用是否出错
如果出错则打印提示信息,没有出错则继续使用正确的返回值即可;后面的代码依旧保持运行,不会因为错误的参数而导致程序中断
public class ExceptionDemo02 {
public static void main(String[] args) {
int[] arr = {-2, -1, 0, 1, 2, 3, 4, 5};
int num = getNum(arr, 0);
if (num == -1) {
System.out.println("数组为空!");
} else if (num == -2) {
System.out.println("角标越界!");
} else {
System.out.println(num);
}
System.out.println("Main end----------");
}
private static int getNum(int[] arr, int i) {
//预判错误 用错误代码来进行标记
if (arr == null) {
return -1; //-1表示数组为空
}
if (i < 0 || i >= arr.length) {
return -2; //-2表示角标越界
}
return arr[i];
}
}
弊端:错误代码如果设置的不合理会和正确数据冲突且当代码出现错误时不会有正常的返回值。
2.用异常对象的思想去处理
也就是意思将错误当成一个对象看待
如何去描述一个错误
错误的时间
错误的原因
错误的地点
异常对象的产生,使用throw关键字进行抛出——throw + 异常对象
public class ExceptionDemo03 {
public static void main(String[] args) {
int[] arr = {-2, -1, 0, 1, 2, 3, 4, 5};
int num = getNum(arr, 10);
System.out.println(num);
}
private static int getNum(int[] arr, int i) {
if (arr == null) {
//产生了一个空指针异常 创建一个空指针异常对象
//如果内部解决不了这个问题 则将该问题抛出 交给调用者处理
throw new NullPointerException("数组为null");
}
if (i < 0 || i >= arr.length) {
//产生了一个数组角标越界异常 创建一个数组角标越界异常对象
//如果内部解决不了这个问题 则将该问题抛出 交给调用者处理
throw new ArrayIndexOutOfBoundsException("角标越界");
}
return arr[i];
}
}