异常:就是程序在运行时出现不正常情况,如除数为0.
异常由来:问题也是现实生活中一个具体的事物,也可以通过java类的形式进行描述,并封装成对象,其实就是java对不正常情况进行描述后的对象体现。
一,对于问题的划分,两种:一种是严重的问题,一种非严重的问题。
对于严重的,java通过Error类进行描述。
对于Error一般不便携针对性的代码对其进行处理。
对于非严重的,java通过Exception类进行描述。
对于Exception可以使用针对性的处理方式进行处理。
Throwable
|--Error
|--Exception
二,异常处理:
try{
需要被检测的代码
}
catch(异常类 变量){
处理异常的代码(处理方式)
}
finally{
一定会执行的语句
}
三,对捕获到的异常对象的常见处理方式:
String getMessage();异常信息
String toString();异常名称:异常信息
String printStackTrace();异常名称:异常信息,异常出现的位置,JVM默认的异常处理机制,就是调用这个方法,打印异常的堆栈的跟踪信息。
public class Test {
public static void main(String args[]) //throws Exception 在这里抛给了虚拟机去处理,虚拟机遇见异常就结束程序了
{
ExceptionDemo d= new ExceptionDemo();
int x;
try {
x = d.div(4, 0);
System.out.println("x="+x);
} catch (Exception e) {
System.out.println("除数为0了");
}
System.out.println("over");
}
}
class ExceptionDemo{
//在功能上通过throws关键字声明了该功能有可能会出现异常
//声明了异常以后,调用者就要处理,不处理就会编译失败。如果不声明,调用者不会编译报错
int div(int a,int b) throws Exception{
return a/b;
}
}
四,
throw和throws区别:
throw使用在函数内,throws使用在函数上(写在函数名后面)
throws后面跟的是异常类,可以跟多个,用逗号隔开;
throw后跟的是异常对象。
五,
对多异常的处理:
1,声明异常时,建议声明更具体的异常,这样处理的更具体。
2,方法声明几个异常,就对应几个catch块,不要定义多余的catch块。如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。
建议在进行catch处理时,catch中一定要定义具体处理方式,不要简单的定义一句e.printStackTrace();也不要简单的写一条输出语句。
真正开发中,会把异常写到一个异常日志文件中。
六,RuntimeException异常
package test;
import java.io.File;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
/**
* Excetpion中有一个特殊的子类异常RuntimeException 运行时异常
*
* ArithmeticException是RuntimeException的子类。
* 如果在函数内抛出该异常,函数上可以不用声明,编译可以通过。
* 如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过。
*
* 自定义异常时,如果该异常的发生,无法再继续进行运算,
* 就让自定义异常继承RuntimeException。
*
* Object类的wait(long timeout)方法,在函数声明时,只声明了InterrupteException异常,
* 但是在函数说明时却抛出了IllegalArgumentException和IllegalMonitorStateException异常。
* IllegalArgumentException和IllegalMonitorStateException异常都是RuntimeException异常的子类。
* 注意:对于异常分两种:
* 1,编译时被检测的异常,这个异常是可以处理的。
* 2,编译时不被检测的异常(运行时异常--RuntimeException以及其子类)
* 在自定义异常的时候,要分析问题是不是可以处理,可以处理就使用Excepttion;
* 如果需要程序停下来修正后再继续执行,则使用RuntimeException
*
*/
public class Test {
public static void main(String args[]) //throws Exception 在这里抛给了虚拟机去处理,虚拟机遇见异常就结束程序了
{
ExceptionDemo d= new ExceptionDemo();
int x;
x = d.div(4, 0);
System.out.println("x="+x);
System.out.println("over");
}
}
class ExceptionDemo{
int div(int a,int b){//throws ArithmeticException
//如果这里声明ArithmeticException异常,则调用者在调用这个方法时,必须处理异常。
//这里之所以不用再函数声明,是因为不需要让调用者处理,因为调用者处理后就不知道方法有没有异常了。
//当该异常发生,希望程序停止,因为在运行时,出现了无法继续运算的情况,
//希望停止程序,由程序员对代码进行修改,
if(b==0){
throw new ArithmeticException("被零除啦");
}
return a/b;
}
}