一 java 异常和错误层次图
1.1 图1
1.2 图2
二 异常生的过程
1 异常可以结束函数.
同时也让程序结束了.
三 异常和错误的发生和区别
Java运行时期发生的问题就是异常。
Java中运行时发生的除了异常Exception还有错误Error。
异常:通常发生可以有针对性的处理方式的。如:定义一个数组arr[3],但是你要访问第4个值 .就会发生数组index越界
错误:通常发生后不会有针对性的处理方式。如:定义一个数组arr[1024*1024*1024] 发生内存不足
Error的发生往往都是系统级别的问题,都是jvm所在系统发生的并反馈给jvm的。
无法针对处理,只能修正代码。
3.1 异常
如:定义一个数组arr[3],但是你要访问第4个值 .就会发生数组index越界
3.2 错误
如:定义一个数组arr[1024*1024*1024] 发生内存不足
四 异常的的简单应用
异常的应用:
在编写程序时,必须要考虑程序的问题情况。
举例:卖水果功能需要传递钱参数,有可能有假币。
所以定义定义程序需要考虑程序的健壮性。
加入一些逻辑性的判断。
4.1 自己抛异常
class Demo { /* 对给定的数组通过给定的角标获取元素。 */ int getElement(int[] arr,int index) { /*1 jvm出了问题,自己打包对象并抛出。 但是它所提供的信息不够给力。想要更清晰,需要自己写。 它的抛出不满足我们的要求。准备自己抛。 */
// 自己写的
if(arr==null) { throw new NullPointerException("arr指向的数组不存在"); } if(index<0 || index>=arr.length) {
// 2 //该条件如果满足,功能已经无法继续运算。这时 就必须结束功能,并将问题告知给调用者。这时就需要通过异常来解决。 //怎么用呢? //1,创建一个异常对象。封装一些提示信息(自定义)。 //2,需要将这个对象告知给调用者。怎么告知呢?怎么将这个对象传递到调用者处呢?通过关键字throw就可以完成。 throw 异常对象; //3,throw用在函数内,抛出异常对象,并可以结束函数。 throw new ArrayIndexOutOfBoundsException("错误的角标,"+index+"索引在数组中不存在"); } int element = arr[index]; return element; } }
测试 class ExceptionDemo3 { public static void main(String[] args) { Demo d = new Demo(); int[] arr = {34,12,67}; int num = d.getElement(null,2); //arr指向的数组不存在
System.out.println("num="+num); System.out.println("over"); } }
4.2 小练习
4.2.1 问题
public class Test { public static void main(String[] args) { Person p = new Person("qq",-5); } } class Person { private String name; private int age; Person(String name,int age) { //加入逻辑判断。 if(age<0 || age>200) { System.out.println("年龄数值错误"); return;//终止初始化。 } this.name = name; this.age = age; } //定义Person对象对应的字符串表现形式。覆盖Object中的toString方法。 public String toString() { return "Person[name="+name+",age="+age+"]"; } }
结果
这样做虽然可以编译并运行看到提示消息,但是问题却没有发生,程序还在继续执行。并打印p对象。
这是不合理的。
4.2.2改进用异常处理
package test; public class Test { public static void main(String[] args) { Person p = new Person("qq", -5); } } class Person { private String name; private int age; Person(String name, int age) { // 加入逻辑判断。 if (age < 0 || age > 200) { throw new IllegalArgumentException(age + ",年龄数值非法"); // 这里发生了变化 } this.name = name; this.age = age; } // 定义Person对象对应的字符串表现形式。覆盖Object中的toString方法。 public String toString() { return "Person[name=" + name + ",age=" + age + "]"; } }
结果
五 异常的自定义和体系
5.1 自定义异常思考
能不能定义一个符合我的程序要求的问题名称。
异常的信息都可以自定义,那么异常的名字是否可以定义呢?是否可以定义成更符合自己程序的阅读呢?
之前的几个异常都是java通过类进行的描述。并将问题封装成对象,这是符合面向对象思想。
其实:异常就是将问题封装成了对象。
所以我也准备对自己所需要的问题进行类的描述。
5.2 自己定义并抛出
package test; public class Test { public static void main(String[] args) { Person p = new Person("qq", -5); } } class NoAgeException{ NoAgeException(){} NoAgeException(String message){} } class Person { private String name; private int age; Person(String name, int age) { // 加入逻辑判断。 if (age < 0 || age > 200) { throw new NoAgeException(age + ",年龄数值非法"); } this.name = name; this.age = age; } // 定义Person对象对应的字符串表现形式。覆盖Object中的toString方法。 public String toString() { return "Person[name=" + name + ",age=" + age + "]"; } }
结果
5.3 自定义异常加上父类Throwable
class NoAgeException extends Throwable{ NoAgeException(){} NoAgeException(String message){} }
结果
5.4 自定义异常加上父类RunTimeException
加上super(message)得到结果