异常
概念:异常是指在程序运行中所发生的不正常的事件,它会中断正在运行的程序。
异常的本质就是Java对可能出现的问题进行描述的一种对象体现。
异常的分类:
异常:我们可以处理。
编译时异常:只要是Exception的子类,但同时不是RuntimeException的子类称为编译时异常。
运行时异常:只要是RuntimeException或者是RuntimeException的子类称为运行时异常。
错误:我们无法处理。
Java提供了完整异常体系框架:顶层父类是Throwable
为什么将Throwable设计成类?而不是抽象类或者是接口?
因为Throwable的所有子类都没有自己的方法,都是来自于Throwable。
异常处理
异常处理的目的:
一:保证程序继续执行
二:打印错误信息给程序员进行调试
异常处理格式:
try {
//有可能出现异常的语句;
}catch(异常类型 对象){
//异常处理;
}catch(异常类型 对象){
//异常处理;
}catch(异常类型 对象){
//异常处理;
}finally{
//不管是否出现异常,都会执行的代码;(如果不需要finally,可以省略)
}
注意:
1.程序一旦在try 块中出现异常,无论try 块中该异常语句下面有多少行代码,都不会被执行。
2.一般Exception作为异常接收放在catch块的最后面,用来接收所有异常,保证程序可以继续执行。
public class Demo {
public static void main(String[] args) {
System.out.println("start");
try {
System.out.println("数学计算:" + (10 / 0));//一旦这里捕获到异常,try后面的所有代码均不会被执行
System.out.println("程序执行中");
} catch (NullPointerException ne) {
System.out.println("空指针异常");//匹配不成功,继续往下匹配
}
/* catch (ArithmeticException ae) {
System.out.println("除数不能为0");//匹配成功,输出异常信息
}*/
catch (Exception e) { //一般会在异常处理的最后面填写Exception接收所有异常,保证程序安全性
e.printStackTrace();//输出虚拟机捕获到的异常信息
} finally {
System.out.println("不管是否有异常,我都会执行!");
}
System.out.println("over");
}
}
throws关键字
throws抛异常,抛出给调用者处理
throws方式处理异常
[访问权修饰符] 返回值类型 方法名(参数列表) [throws 异常类名] {
方法体
}
public class Demo02 {
public static void main(String[] args) {
method1();
}
private static void method1() throws ArithmeticException {
try {
method2();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void method2() throws ArithmeticException {
int a = 10;
int b = 0;
System.out.println(a / b);
System.out.println("over");
}
}
注意:
1.如果是主方法,我们必须处理,因为我们不处理JVM会处理,JVM会将程序结束,不满足异常处理的本质2.
2.如果一个方法抛出一个异常,那么子类不能抛出的异常不能够被放大
3.我们可以在一个方法上声明多个异常,中间使用逗号隔开,表示异常出现的可能性
4.当一个方法抛出的是一个编译时异常的时候,必须处理,不处理就会报错
throw关键字
格式:
throw 异常对象;
throw和throws的区别:
1.throws是在方法的声明上,throw是在方法体内
2.throws声明的是异常类,并且可以声明多个,throw抛出的是异常对象,只能够抛出一个
3.throws表示异常出现的可能性,throw表示异常出现的必然性
public class Demo03 {
public static void main(String[] args) {
System.out.println("start");
try {
method1();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void method1() throws ArithmeticException {
int a = 10;
int b = 0;
if (b == 0) {
throw new ArithmeticException("除数不能为0");
}
System.out.println(a / b);
System.out.println("over");
}
}
自定义异常
1.书写自定义异常继承Exception,RuntimeException
2.书写构造方法
- 无参
- 带错误信息的参数
/*自定义异常
* 异常本质就是Java当中对可能出现的问题进行描述的一种对象体现
* 要求考试成绩必须在0-100之间*/
public class Demo04 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入分数:");
double score = input.nextDouble();
try {
System.out.println(isBetween0To100(score));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (input != null) {
input.close();
}
}
}
public static boolean isBetween0To100(double score) throws ScoreExcepticon {
if (score < 0 || score > 100) {
throw new ScoreExcepticon("分数必须在0-100之间");
}
return true;
}
}
class ScoreExcepticon extends Exception {
private static final long serialVersionUID = 1L;
public ScoreExcepticon() {
super();
}
public ScoreExcepticon(String s) {
super(s);
}
}