异常
一、相关概念
Java在运行过程中或编译过程中,难免会出现一些报错,导致程序运行的中断,这些报错其实指的就是异常。所以我们需要如何解决这些错误,也就是如何解决异常。更需要看到报错信息,能够快速找到异常出现的位置,然后将它修改。
二、分类
第一级类:Java中所有异常或错误的顶级父类都是:Throwable类。
第二级类:其中Throwable分为错误-error和异常-exception 两大类
第三级类 :error下的子类 和 exception下的子类。
error指的是:错误,无法通过代码解决的错误。
exception指的是:异常,可以解决的错误。
三、Error详解
一般是程序中较严重的出错,是虚拟机层面的异常,一旦发生将会导致系统崩溃,无法由程序自身处理,只能通过修改虚拟机的设置,理解为修改虚拟机的相关参数,例如内存大小等。
例如以下代码就会出现内存溢出错误:
int arr [] = new int[1000000000];
System.out.println(arr.length);
OutOfMemoryError:又称OOM,表示内存溢出错误,通常发生在内存泄露或内存不足的情况。
四、Exception详解
Java中最常出现的就是异常,俗称BUG,没有 没有BUG的程序,如果某个程序没有BUG,那么说明这个程序是个垃圾程序。
五、异常分类
运行时异常和编译时异常。
运行时异常:指的是运行过程中才出现的异常。
编译时异常:指的是编译过程中就出现了异常。
编译过程:理解为代码写完后都没运行,就报错。
六、常见的运行时异常
空指针异常(NullPointException)
数组越界异常(ArrayIndexOutOfBoundsException)
数字格式化异常(NumberFormatException)
算数运算符异常(ArithmeticException)
一般来说:
运行时异常不用去特意处理,而是通过仔细编写代码来避免这些异常。
//空指针异常(NullPointException) //指的就是 某个对象是null。你还去调用它的属性或方法。 // String str = null; // System.out.println(str.length()); // // 数组越界异常(ArrayIndexOutOfBoundsException) // 获取的元素下标超过了数组原有的最大长度 // int a[] = {1,2,3,4}; // System.out.println(a[4]); // NumberFormatException 数字解析溢出 // 将非数字的字符串解析成数字 // String str = "12/345";//假设用户从前台输入的这个数量 后台只能通过String接受 // int num = Integer.parseInt(str);//将字符串转成数字 // System.out.println(num); // 算数运算符异常(ArithmeticException) System.out.println(1/0); // 一般来说: // 运行时异常不用去特意处理,而是通过仔细编写代码来避免这些异常。 |
编译时异常:还没运行就报错了,根本就不让你运行
由于知识点的局限性,导致13章才能解除到大量的编译时异常。
暂时就以Class.forName("xxx");作为代替。
上述代码的意思:加载指定的类。
例如:常见面试题: 获取对象的几种方式:
1.通过new来获取
2.Class.forName
3.Object中的clone方法
4.序列化
package com.yyzy.test; public class Demo3 { public static void main(String[] args) throws Exception{ Class.forName("com.yyzy.test.Stud1ent"); a1(); 以上代码就是典型的编译异常、 需要去解决: 解决的方式分为2种 推荐用第二种 1.抛异常(甩锅) 直接在异常代码所在的方法的尾巴后面加上 throws XxxException 一般来说就加个throws Exception 甩锅:谁调用它,谁去解决它,如果是Main方法调用,则不解决了。 2.抓异常(当场解决) 详情见Demo4 */ } public static void a1() throws Exception{ Class.forName("com.yyzy.test.Stud1ent"); } } |
package com.yyzy.test; import java.util.Scanner; public class Demo4 { public static void main(String[] args) { //如何抓异常(当场解决) 语法如下: /* try{ 可能出现异常的代码; }catch (可能出现的异常类 变量名){ 哪一行如果出现了异常就立即进入这里而非报错; } */ // try { // System.out.println("我没有出现异常"); // Class.forName("com.yyzy.test.Student"); // }catch(Exception abc) { // System.out.println("我是异常出现了"); // } //抓异常的升级版 /* try{ 可能出现异常的代码; }catch (可能出现的异常类 变量名){ 哪一行如果出现了异常就立即进入这里而非报错; }finally{ 不管有没有出异常,都要执行这里, } */ // Scanner sc = new Scanner(System.in); // System.out.println("请输入你的id"); // try { // int id = sc.nextInt(); // System.out.println("你的id为" + id); // // }catch(Exception e) {//衍生: 如果想要知道异常的具体信息,可以通过e.getMessage获取即可 // System.out.println("你输入的数字格式有误" + e); // }finally { // sc.close(); // System.out.println("sc成功关闭"); // } //衍生: try和catch的关系: //如果想对catch的异常进行分类,可以出现多个catch // try { // String str = null; // System.out.println(str.length()); // int a = 1/0; // }catch (NullPointerException e) { // System.out.println("空指针报错了"); // }catch (ArrayIndexOutOfBoundsException e) { // System.out.println("数组下标异常进入这里"); // }catch (NumberFormatException e) { // System.out.println("数字解析异常"); // } // //说明try后面可以不跟catch // try { // System.out.println(1); // }finally { // System.out.println(2); // } // //说明try不能单独使用,要么跟catch一起 要么跟finally一起 // try { // System.out.println(1); // } //catch和finally必须要结合try使用 // catch(Exception e) { // // }finally { // // } } } |