Error和Exception
什么是异常
-
实际工作中遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求、你的程序要求打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等。我们的程序在跑着,内存或硬盘可能满了等等。
-
软件程序在运行过程中,非常可能遇到刚刚提到的这些异常问题,我们叫异常,英文名是:Exception,意思是例外。这些,例外情况,或者叫异常,怎么让我们写的程序作出合理的处理而不至于程序崩溃。
-
异常指程序运行中出现的不期而至的各种情况,如:文件找不到、网络连接失败、非法参数等。
-
异常发生在程序运行期间,他影响了正常程序执行流程
简单分类
-
要理解Java异常处理是如何工作的,你需要掌握一下三种类型的异常:
-
异常处理框架
-
检查性异常:最具代表性的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在的文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
-
运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略
-
错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,他们在编译时检查不到的
异常体系结构
- Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类
- 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error(无法预料)和异常Exception(可以预料)
Error
- Error类对象由Java虚拟机生成并抛出,大多数错误与代码编写这所执行的操作无关
- Java虚拟机运行错误(Virtual MachineError),当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,Java虚拟机一般会选择线程终止
- 还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError)、链接错误(LinkageError)。这些错误是不可检查的,因为它们在引用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的情况
Exception

异常处理机制
-
抛出异常
-
捕获异常
-
异常处理五个关键字
- try、catch、finally、throw、throws

package com.java.exception;public class Demo01 {public static void main(String[] args) {//System.out.println(11/0);-------->ArithmeticException//除零异常//new Demo01().a(); ----->栈溢出错误(error)StackOverflowError}
// public void a(){
// b();
// }
// public void b(){
// a();
// }
}
package com.java.exception;public class Test {public static void main(String[] args) {int a=1;int b=2;try {//监控区域内代码System.out.println(a/b);}catch (ArithmeticException e){//如果要捕获多个异常,应当从小到大排序⬇System.out.println("程序异常,请检查程序,b不能为零喵");}catch (Throwable t){System.out.println("Throwable喵");} finally {//处理善后工作,无论出不出现错误,都会执行System.out.println("结束了喵");}}
}
package com.java.exception;import org.w3c.dom.ls.LSOutput;public class Demo02 {public static void main(String[] args) {int a=1;int b=0;try {new Demo02().chu(a,b);} catch (ArithmeticException e) {System.out.println("坏掉了喵~");} finally {}}//假设这个方法中处理不了这个异常,可以用throws向上抛出异常public void chu(int a,int b) throws ArithmeticException{if (b==0){// throw throwsthrow new ArithmeticException();//主动抛出异常,一般在方法中使用}System.out.println(a/b);}}
/*
if (b==0){// throw throwsthrow new ArithmeticException();//主动抛出异常}try {//cmd/alt + ctrl + t 快捷生成System.out.println(a/b);} catch (Exception e) {//catch(想要捕获的异常类型)捕获异常throw new RuntimeException(e);//打印错误的栈信息} finally {}*/
自定义异常


package com.java.exception.demo02;public class MyException extends Exception{//传递数字>10private int detail;public MyException( int a) {this.detail = a;}//toString 异常的打印信息@Overridepublic String toString() {return "MyException{" + detail + '}';}
}
package com.java.exception.demo02;public class Test {//先写一个可能存在异常的方法public static void Test(int a) throws MyException {System.out.println("传递的参数是"+a+"喵");if (a>10){throw new MyException(a);//抛出异常方法就结束了}System.out.println("结束了喵");}public static void main(String[] args) {try {Test(11);} catch (MyException e) {//增加一些处理异常的代码,将损失降到最小System.out.println("这是我自定义的异常喵=>"+e);}}
}