1.异常的概念
我们在编写代码时,总不会一帆风顺,在编写的时候总会出现各种各样的问题,问题一旦出现,后果就是程序出现终止 ,我们发现这些问题共分为两类,一类是我们没有办法解决,也就是问题为错误(Error ),比如jvm丢失文件、线程中断;另一类是我们可以解决的,解决之后程序可以正常执行,这类问题成为异常。
异常可以分为可查异常(checked exceptions)和不可查异常(unchecked exceptions),所有的异常归结到底都是从Exception类中继承过来的,如下面关系:
受查数据(IOException)和非受查数据(RuntimeException)继承于Exception类。
2.异常的处理
异常的处理一般用五个关键字来进行表示和处理,主要的关键字为try\catch\throw\throws\finally
1、try:用来包裹可能出现异常的代码
2、catch:用来和异常的类型进行比较,catch可以有多个,哪个比较上了,就执行哪个catch,执行完毕,继续向下执行。
- 执行过程中try不能独立存在,try和catch必须同时使用,当jvm虚拟机开始执行try块中代码,如果没有出现任何异常,那么catch也不会执行,如果出现异常,此时将由jvm帮我们判断异常的种类,并创建异常对象,接着和每一个catch块的参数进行比较,和哪个比较上了,那么就执行此catch块,执行完毕整个try,catch结束,继续向下运行。我们没有处理异常,异常最终由虚拟机处理,虚拟机的处理就是终止程序执行,并打印堆栈信息,如下面代码:
public class Student {
public void speak(int m)
{
try {
if (m > 1000)
throw new MyException("您输入的数大于1000");
}catch(InputMismatchException|MyException my){}
finally{
System.out.println("这个程序执行结束,现在释放内存");
}
}
public static void main(String[] args) {
Student student=new Student();
student.speak(1230);
}
}
3、throws:意思为抛出去,如果我们不想处理该异常,我们就将该异常抛出外面,由外面来进行处理,如果外面不处理,那么由由虚拟机进行处理,抛出语句必须写在方法申明的后面如下面句子
public class Number {
public void count() throws Exception{
double random1= Math.random();
double random2=Math.random();
double num=random1*random2;
System.out.println("这两个数相乘的结果为:"+num);
}
public static void main(String[] args) {
Number number=new Number();
try{
number.count();
}catch (Exception e){
System.out.println("您输入的数有异常");
}finally {
{
System.out.println("这个程序运行结束,现在释放内存");
}
}
}
}
4、finally:表示最后的、最终的,表示在任何情况下要执行代码,因为有时打开了一些资源,但后面出现了异常,此时这些资源得不到释放,就会出现内存泄漏,此时有了关键字finally,不管是否出现异常,都会执行,我们通常吧必须要执行的代码放到finally。
5、自定义异常
表示我们自己定义的异常,只要我们继承任意一个异常类即可,通常我们继承于Exception。