Java 异常
异常:就是程序在运行时出现不正常情况。
异常由来:问题也是现实生活中一个具体的事物,可通过java以类的形式进行描述。并封装成对象。
一、问题的划分
- 严重的问题
- java通过Error类进行描述。一般不编写针对性的代码对其进行处理。
- 非严重的问题
- java通过Exception类进行描述。可以使用针对性的处理方式进行处理。
二、异常的处理
- java 提供了特有的语句进行处理。
- 一般情况下,函数内出现异常,函数上需要声明。
- jvm默认的异常处理机制,就是在调用printStackTrace方法(打印异常的堆栈的跟踪信息)
- 当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。
- 要么在内部try catch处理。
- 要么在函数上声明让调用者处理。
try{
需要被检测的代码;
}
catch(异常类 变量){
处理异常的代码;(处理方式)
}
//可选
finally{
一定会执行的语句;
}
class Demo {
int div(int a, int b)throws ArithmeticException//在功能上通过throws的关键字声明了该功能有可能会出现问题。
{
return a / b;
}
}
class ExceptionDemo {
public static void main(String[] args) {
Demo d = new Demo();
try {
int x = d.div(4, 0);
System.out.println("x=" + x);
} catch (ArithmeticException e)/ArithmeticException e = new ArithmeticException();
{
System.out.println("除零啦");
System.out.println(e.getMessage());
System.out.println(e.toString());// 异常名称:异常信息。
e.printStackTrace();//异常名称,异常信息,异常出现的位置。
}
System.out.println("over");
}
}
运行结果:
除零啦
/ by zero
java.lang.ArithmeticException: / by zero
java.lang.ArithmeticException: / by zero
at Demo.div(Test.java:54)
at Test.main(Test.java:66)
over
对多异常的处理
- 声明异常时,建议声明更为具体的异常。这样处理的可以更具体。
- 对方声明几个异常,就对应有几个catch块。不要定义多余的catch块。
- 如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。
自定义异常
当出现的特有问题未被java所描述并封装对象。可以按照java对问题封装的思想,将特有的问题进行自定义的异常封装。
如何定义异常信息呢?
因为父类中已经把异常信息的操作都完成了。所以子类只要在构造时,将异常信息传递给父类通过super语句。
那么就可以直接通过getMessage方法获取自定义的异常信息。
- 必须是自定义类继承Exception。
throws和throw的区别
- throws 使用在函数上。后面跟多个异常类,用逗号隔开。
- throw 使用在函数内。后面跟的是异常对象。
class FuShuException extends Exception //getMessage();
{
private int value;
FuShuException(String msg, int value) {
super(msg);
this.value = value;
}
public int getValue() {
return value;
}
}
class Demo {
int div(int a, int b) throws FuShuException {
if (b < 0) {
throw new FuShuException("出现了除数是负数的情况------ / by fushu", b);//手动通过throw关键字抛出一个自定义异常对象。
}
return a / b;
}
}
class Test {
public static void main(String[] args) {
Demo d = new Demo();
try {
int x = d.div(4, -9);
System.out.println("x=" + x);
} catch (FuShuException e) {
System.out.println(e.toString());
System.out.println("错误的负数是:" + e.getValue());
}
System.out.println("over");
}
}
运行结果:
FuShuException: 出现了除数是负数的情况------ / by fushu
错误的负数是:-9
over