Throwable类、异常处理try…catch、JVM的默认处理方案、Throws和Throw的区别、自定义异常
Throwable
所在包:java.lang
java.lang.Object
java.lang.Throwable
public class Throwable
extends Object
implements Serializable
Throwable的两个需要了解的子类:
Error:
public class Error extends Throwable //计算机算力或编译器无法控制的错误
-------------------------------------------------------------------------------------------------
Exception:
public class Exception extends Throwable //异常类、表示程序本身可以解决的问题
Exception的两个需要知道的子类:
-
RuntimeException:在编译期是不检查的,出问题后需要我们回来修改代码(比如1/0出现算术错误)
-
非RuntimeException:编译期就必须处理的,否则程序不能通过编译,不能正常运行。
注意:JVM虚拟机的默认处理方案在检测到程序有异常后会输出异常代码的位置、原因
Throwable的常用方法(通过Exception的实例对象来调用以下方法):
方法名 | 作用 |
---|---|
public String getMessage() | 返回此throwable的详细信息字符串 |
public String toString() | 返回此可抛出异常的简短描述 |
public void printStackTrace() | 把异常的错误信息输出在控制台 |
public void printStackTrace(PrintStream ps) | 通常用该方法将异常内容保存在日志文件中,以便查询 |
异常处理try…catch用法
格式:
try{
可能出现异常的代码;
}catch(异常类名 对象名){ //出现异常,会自动生成一个异常类对象,该异常对象将被提交给JAVA运行时系统当JAVA运行时系统接收到异常对象时,会到catch中去找匹配的异常类,找到后进行异常的处理
异常的处理代码;
}finally{...} //最后一定会执行的代码除非JVM提前退出
代码实例:
public static void main(String[] args){
System.out.println("开始");
method();
System.out.println("结束");
}
public static void method(){
try{
int[]arr={
1,2,3};
System.out.println(arr[3]);//ArrayIndexOutOfBoundsException()
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("访问错误");
//e.printStackTrace(); printStackTrace()方法是把异常的错误信息输出在控制台
}
}
Throws异常的处理方法
格式:方法名 throw 异常名
- 编译时异常必须要进行处理,两种处理方案:try…catch…或者throws这种方案,将来谁调用谁处理
- 运行时异常可以不处理,出现问题后,需要我们回来修改代码
Throws和Throw的区别:
- Throws:用在方法声明后面,跟的是异常类名。表示抛出异常,由该方法的调用者来处理。表示出现异常的一种可能性,并不一定会发生这些异常
- Throw:用在方法体内,跟的是异常对象名。表示抛出异常,由方法体内的语句处理。执行throw一定抛出了某种异常
代码示例:
public static void method() throws ArithmeticException {
// 跟在方法声明后面,后面跟的是异常类名
int a=10;
int b=0;
if(b==0) {
throw new ArithmeticException();用在方法体内,后面跟的是异常类对象名
}else {
System.out.println(a/b);
}
}
}
自定义异常
格式:
public class 异常名 extends Exception{
无参构造();
带参构造(E){
super(E);
}
}
代码示例:
public class ScoreException extends Exception{
ScoreException();
ScoreException(String s){
Super(s);
}
}
public class Teacher{
//throws用在方法声明后面
public void score(int score) throws ScoreException{
if(score<0||score>100){
throw new ScoreException("你给的分数有误");
}else{
System.out.println("分数无误");
}
}
}
编译时异常和运行时异常的区别
编译时异常:必须显示处理,否则程序就会发生错误无法通过编译
运行时异常:无需显示处理,也可以和编译时异常一样处理