【Java基础】异常
异常
JVM的默认处理方案
如果程序出现了问题,我们没有做任何处理,最终JVM会做默认的处理
把异常的名称,异常原因及异常出现的位置等信息输出在了控制台、程序停止执行
异常处理
1.4异常处理之try…catch.…
格式:try{
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码:}
执行流程:
程序从try里面的代码开始执行
出现异常,会自动生成一个异常类对像,该异常对像将被提交给Java运行时系统
当ava运行时系统接收到异常对像时,会到catch中去找匹配的异常类,找到后进行异常的处理
执行完毕之后,程序还可以继续往下执行
1.5 Throwable的成员方法
方法名 说明
public String getMessage() 返回此throwable的详细消息字符串
public String toString() 返回此可抛出的简短描述
public void printStackTrace() 把异常的错误信息输出在控制台
编译时异常和运行时异常的区别
Java 中的异常被分为两大类:
编译时异常和运行时异常,也被称为受检异常和非受检异常
所有的 RuntimeException类及其子类被称为运行时异常,其他的异常都是编译时异常
编译时异常:必须显示处理,否则程序就会发生错误,无法通过编译
运行时异常:无需显示处理,也可以和编译时异常一样处理
异常处理之 throws
虽然我们通过 try…catch…可以对异常进行处理,但是并不是所有的情况我们都有权限进行异常的处理
也就是说,有些时候可能出现的异常是我们处理不了的
针对这种情况,Java提供了throws的处理方案
格式:
throws 异常类名;//只是将异常抛出 ,并未真正处理
注意:这个格式是跟在方法的括号()后面的。
编译时异常必须要进行处理,两种处理方案: try…catch…或者 throws,如果采用throws 这种方案,将来谁调用谁处理。
运行时异常可以不处理,出现问题后,需要我们回来修改代码
自定义异常
用于自定义处理不合理数据等
格式:
public class 异常类名
extends Exception {
无参构造
带参构造}
范例:
public class ScoreException extends Exception{
public ScoreException()
{ }
public ScoreException(String message){
super(message);}}
具体实例:
自定义分数范围,超出范围(小于0或大于100)则抛出异常
定义分数异常类,有参和无参构造器
public class ScoreException extends Exception{
public ScoreException(String message){
super(message);
}
public ScoreException(){}
}
这里用try …catch抛出异常
import java.util.Scanner;
public class ScoreText {
public static void main(String[] args) {
System.out.println("请输入分数:");
Scanner scanner = new Scanner(System.in);
int score = scanner.nextInt();
Teacher teacher = new Teacher();
try {
teacher.checkScore(score);
} catch (ScoreException e) {
e.printStackTrace();
}
}
}
class Teacher{
public void checkScore(int score) throws ScoreException{
if(score >= 100 || score <= 0){
throw new ScoreException("分数有误");
}//throw为异常提示
else {
System.out.println("正常");
}
}
}
结果如下:
请输入分数:
120
work1.Exception.userdefined.ScoreException: 分数有误
throws和 throw 的区别
throws throw
用在方法声明后面,跟的是异常类名 用在方法体内,跟的是异常对象名
表示抛出异常,由该方法的调用者来处理 表示抛出异常,由方法体内的语句处理
表示出现异常的一种可能性,并不一定会发生这些异常 执行 throw 一定抛出了某种异常