常见异常分类:
一,Throwable(可投掷的,抛出。):
1,Error(错误):硬件出现问题
2,Exception(异常):
编译异常:
- Class(类)Not(不是)Found(成立)Exception:找不到类异常
- IO(IO)Exception(异常):IO异常
- File(文件)Not(不是)Found(成立)Exception:找不到文件异常
Runtime(运行)Exception(异常):
- Class(类)Cast(投掷)Exception(异常):类转换异常
- Null(空)Pointer(指针)Exception(异常):空指针异常
- Array(数组)Index(索引)Out(出去)Of(的)BoudsException(异常):数组索引越界异常
- File(文件)System(系统)Not(不是)Found(成立)Exception(异常):找不到文件系统异常
- Arithmetic(算数)Exception(异常):算数异常
- Number(数字)Format(格式)Exception(异常):数字格式异常
异常处理:
异常处理流程:
- 程序中产生异常后,Jvm根据异常的类型实例化异常类的对象;若程序中不存在异常处理操作,则这个实例化的对象的默认处理方式是jvm进行异常的信息的输出,而后终端程序。
- 存在异常处理,由try语句捕获该异常对象,与程序后面的catch进行匹配,匹配失败则交由JVM进行处理。
- 有无异常都会执行finally中的程序,若无异常,finally语句执行完后继续后面的程序语句;若存在没有能够处理的异常对象,finally语句会交给JVM进行信息的输出,并且中断程序。
编译时异常处理方式:
1,throws(投掷)关键字处理:
当前方法不用处理该异常对象,可以直接将异常对象抛出给他的调用者(上级),由上级处理,若所有调用者都没处理或(最顶级的调用者main方法里都没有处理该异常),则由JVM输出异常信息程序中断。
2,try{...}catch{...}finally{...}
语句处理格式:
try{
可能出现异常的代码块,范围越少越好
}catch(异常类型 异常对象名){
异常处理语句;
}finally{
需要释放的资源;
}
Static public void main(String[] args){
try{
System.out.println("aaa");
Trycat.cot();
}catch(ArithmeticException e){
e.printStackTrace();
}finally{
System.out.println("此行代码一定会被执行");
}
}
private static void cot() throws ArithmeticException{
int i = 10,j = 0;
int k = i/j;
}
运行结果:
"C:\Program Files\Java\jdk1.8.0_311\bin\java.exe" "-javaagent:C:\Users\蜡笔小新\IntelliJ IDEA Community Edition 2021.3.2\lib\idea_rt.jar=56723:C:\Users\蜡笔小新\IntelliJ IDEA Community Edition 2021.3.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_311\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\rt.jar;D:\yuanchangqiproject01\out\production\异常" com.yichang.TryCat
aaaa
此行代码一定会被执行
java.lang.ArithmeticException: / by zero
at com.yichang.TryCat.cout(TryCat.java:16)
at com.yichang.TryCat.main(TryCat.java:7)
进程已结束,退出代码0
3.throw 关键字自定义异常
(1)手动抛出异常
public class Throws {
public static void main(String[] args) {
Student sut = new Student();
try{
sut.regIst(-30);
}catch(Exception e){
//e.printStackTrace();
System.out.println(e.getMessage());//通过Exception的构造器方法输出
}
System.out.println(sut);
}
}
class Student{
private int id;
public void regIst(int id) throws Exception {
//throw new runtimeException("您输入了非法数字");
// 运行时异常可以直接抛出,在运行时解决异常就可以了,运行时异常可以不处理,报错就行了
if (id > 0){
this.id = id;
}else throw new Exception("您输入了非法数字");//编译时异常必须处理
运行结果
"C:\Program Files\Java\jdk1.8.0_311\bin\java.exe" "-javaagent:C:\Users\蜡笔小新\IntelliJ IDEA Community Edition 2021.3.2\lib\idea_rt.jar=57855:C:\Users\蜡笔小新\IntelliJ IDEA Community Edition 2021.3.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_311\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\rt.jar;D:\yuanchangqiproject01\out\production\异常" com.yichang.Throws
您输入了非法数字
com.yichang.Student@1b6d3586
进程已结束,退出代码0
throw小结:throw只能抛出一个异常类的对象
(2)自定义异常:
public class MyException extends RuntimeException {
static final long serialVersionUID = -703786464564L;
public MyException() {
}
public MyException(String msg) {
super(msg);
}
}
public class Throws02 {
public static void main(String[] args) {
Student stu = new Student();
try {
stu.regIst(-30);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Student02{
private int id;
public void regIst(int id)throws MyException{
if(id > 0){
this.id = id;
}else throw new MyException("您输入了非法数字");
}
}
运行结果:
"C:\Program Files\Java\jdk1.8.0_311\bin\java.exe" "-javaagent:C:\Users\蜡笔小新\IntelliJ IDEA Community Edition 2021.3.2\lib\idea_rt.jar=58133:C:\Users\蜡笔小新\IntelliJ IDEA Community Edition 2021.3.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_311\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\rt.jar;D:\yuanchangqiproject01\out\production\异常" com.yichang.Throws02
您输入了非法数字
进程已结束,退出代码0