异常类的了解、异常的处理方案、编译时期异常和运行时期异常区别、throws和throw的区别、自定义异常类 、捕获异常的标准格式、final、finally、finalize的区别
程序员文章站
2022-07-14 10:28:32
...
文章目录
异常
java.lang.Throwable:异常类( Java 语言中所有错误或异常的超类(父类))
error:严重错误(严重问题)
比如:内存异常!OOM(Out Of Memory)
通过加入内存条...或者将Linux虚拟机的内存空间设置小一点!
Exception: 可以捕获合理的程序!
编译时期异常:只要不是RuntimeException中的子类都是属于编译时期
必须要处理的,不处理编译通不了,没有办法运行的!
运行时期异常RuntimeException:
程序在执行过程中出现的问题
代码逻辑不够严谨导致的!
异常的处理方案
异常的处理方案有哪些:
1)try...catch...finally:标准格式 捕获异常
2)throws:抛出异常 (抛出到方法上)
方式1:捕获异常的变形格式
try...catch...
try...catch...catch...
try...finally... (线程中:Lock锁)
格式:流程
try{
...
...
可能出现问题代码
}catch(异常类名 变量名){具体异常的类
处理异常
自己手动处理
Throwable类中一些方:处理方式(jvm将异常信息输出在控制台并且可以跟踪异常类源码)
}
如果try中存在多个异常,如何处理
1)一个一个try...catch...
2)一个try多个catch...
try...catch...finally(标准格式)
变形格式:
try...catch...
try...catch...catch...(推荐)
JDK7以后:提供一种处理方式
try{
可能出现问题的代码
..
}catch(异常类名1 | 异常类名2 | 异常类名3 ...... 变量名){ 平级关系
处理异常
}
编译时期异常和运行时期的区别
编译时期异常和运行时期的区别?
编译时期的异常:
举例:
String---Date---解析的方法parse(String source) throws ParseException{}
IO流:IOException
...开发者必须要进行显示处理,否则编译通过不了!
运行时期异常:
1)代码逻辑的问题,不进行显示处理,在代码中加入一些逻辑判断
2)也可以进行显示处理:try...catch...
Throwable
关于Throwable中的一些方法
public String getMessage():获取异常的消息字符串
public String toString():获取异常信息的简单描述
异常的全限定名称:包名.类名: 调用该异常对象的getMessage()详细的消息字符串
public void printStackTrace():
将此对象的信息追踪到堆栈中,具体获取到具体源码中哪一块出问题了
Throws
针对异常处理的另一种方式:
throws:抛出异常
抛出在方法声明上,如果方法中的语句体出现了异常,将异常交给jvm,jvm将异常信息输出
控制台上...
throws和throw的区别
throws:抛出
1)书写位置是在方法声明上
2)throws的后面跟的异常类名,而且可以跟多个异常类名,中间使用逗号隔开
3)对于throws它是由调用者进行处理,必须要对带throws的方法进行处理!
4)throws表示抛出异常的一种肯能性(这个方法可能出现问题/可能没有问题!)
throw:抛出
1)书写位置是在方法体中
2)throw的后面跟的异常对象,一般都是匿名对象 new XXXException()
而且只能跟一个异常对象
3)由方法中逻辑判断进行处理(由方法体中语句进行处理)
4)throw:表示抛出异常一种肯定性(执行到逻辑的时候,一定会执行这个异常!)
自定义的异常
import java.util.Scanner;
/*
* 自定义的异常!
* 1)自定义一个类,继承自Exception或者RuntimeException
* 2)提供无参构造方法 /有参构造 传递String参数(消息字符串)
*
* */
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in) ;
System.out.println("请您输入学生成绩:");
int score = sc.nextInt() ;
//创建Teacher对象
Teacher t = new Teacher() ;
t.check(score);
}
}
public class Teacher {
//成员方法
public void check(int score) {
//进行判断
if(score<0 || score>100) {
//一定会出现异常
throw new MyException("当前数据非法数据!") ;
}else {
System.out.println("当前为合法数据!");
}
}
}
//自定义异常类
public class MyException extends RuntimeException {
//无参构造方法
public MyException() {}
//有参构造方法
public MyException(String message) {
super(message) ;
}
}
异常的注意事项
1)子类继承父类的时候,对父类的成员方法进行重写,如果父类的成员方法有异常
那么子类的该方法针对异常处理,要么是跟父类的异常类名一致,要么是父类异常类的子类
2)子类继承父类重写父类的方法的时候
父类的成员方法没有抛出异常,子类的该方法不能抛出异常,只能try...catch...
捕获的标准格式
捕获的标准格式
try{
//可能出现问题的代码
}catch(异常类名 对象名){
对象名.printStackTrice() ;
}finally{
//释放相关系统资源close()
//举例:IO流中: createNewfile():创建文件的方法
//举例:JDBC:java 连接数据库
//Connection: 连接对象---- 使用完毕需要关闭相关的系统资源!
//Statement:执行对象(增删查改的操作):---使用完了也需要释放系统资源
}
try中代码如果不存在问题,代码正常执行,需要执行finally语句,释放系统资源!
finally特点:
释放相关的系统资源,而且finally中的代码一定会执行的;除非在执行finally语句之前
JVM退出了! System.exit(0) ;
try…catch…finally,catch中如果有return语句,那么finally中的代码还会执行吗?
在return之前执行除非Jvm退出了不执行!
final,finally,finalize的区别?
final: 修饰符,表示最终的
final修饰的变量,是一个常量
final修饰的方法不能被重写
final修饰的类不能被继承
finally: 异常的标准格式
try..catch...catch..finally
finally中的语句一定会执行,除非JVM推出了
finalize: 与GC有关,Object类中的方法
当前开启垃圾回收器的时候,调用finalize()方法回收没有更多引用的对象