版权声明:本文出自孤星卟哭的博客,原创文章,转载请注明出处。 https://blog.csdn.net/zcy92949/article/details/80074839
前言
先上图,这是我总结的一个关于异常的图,其中包括异常类之间的关系。
1、异常类简单说明
针对上面的图片,首先在java中所有类的父类都是Object,而异常类的父类Throwable继承Object类,同时Throwable下面还包括两个子类Error和Exception,具体解释如下:
- Error(天灾):个人努力或者计算机系统都无法恢复
- Eeception(在Java的API中封装了几十个类型):
1.非检查型异常(还称之为bug,通常是人的问题eg:ArrayIndexOutOfBoundsException)
编译器在编译时不进行检查,而在运行的时候检查
2.检查型异常(eg:IoException)
编辑器在编译时检查 - 何为非检查型异常,何为检查型异常?
1.非检查型异常
调用该方法的方法可以处理可以不处理
2.检查型异常
调用该方法的方法需要进行异常处理 - 总结:我们平时编写的程序极大多数都是非检查型异常,比如数组越界、空指针异常等。
2、异常书写的基本格式
谈到异常及一定要说明一下异常的基本书写格式,以及我当时遇到的坑。
针对异常,最喜欢挖的坑就是关于return,对此,我有一句话总结:
如果try、catch和finally中都有return,finally中的return将覆盖掉其他return语句。
话句话说就是finally中的return必须执行。
3、自定义的异常如何书写?
以下是我当初学习异常时,记录的一个自定义异常。
/**
* 题目:输出abc时,抛出异常
*
* 说一下整个程序的走向吧,这也是当时我最迷惑的地方。
* 首先在控制台输入一个字符串,程序会实例化Entity类的对象,调用Entity类中的
* Letter()方法,并将输入的字符串当做参数传入;如果输入的字符串不是abc,则输出你输
* 入的内容,如果输入的字符串是abc,则会实例化并调用自定义的异常类,通过throws将这个
* 异常抛出,之后由catch接收到这个异常对象,之后调用自定义异常类中的getSum()方法。
* 输出异常,到此结束。呼!!!
*/
public class ExerciseAbnormal {
public void getSummary() {
String strLetter = null;
try {
@SuppressWarnings("resource")
Scanner objIn = new Scanner(System.in);
strLetter = objIn.nextLine();
Entity objout = new Entity();
objout.Letter(strLetter);
}catch(MyException e) { //catch的作用是抓住异常
e.getSum();
}
}
public static void main(String[] args) {
ExerciseAbnormal objSum = new ExerciseAbnormal();
objSum.getSummary();
}
}
class Entity {
public void Letter(String r) throws MyException {
if(r.equals("abc")){
throw new MyException(); //抛出异常
}else {
System.out.print(r);
}
}
}
@SuppressWarnings("serial")
class MyException extends Exception {
public void getSum() {
System.out.println("输出异常");
}
}
解题思路以上已经说明,比较容易让人困惑的是throws和throw的区别?
- throws(用于方法上)代表这个方法可能会抛出异常,如果抛出多个异常,中间可以用逗号隔开
- throw(用于语句上)代表这里的语句一定需要抛出异常
4、总结
以上就是我对异常的一些基本理解,如有不对之处,希望诸君不吝赐教。