天天看点

异常 异常处理 自定义异常关键知识点及补充异常异常处理 自定义异常

关键知识点及补充

  • 出现异常如果不解决,程序无法继续向下执行
  • 平时我们遇到的异常看书写格式,很明显,都是类,java源码中在会出现异常的地方,都会有 throw new 异常类(); 也就是创建了异常,阻断了我们的编译,或着运行
  • 我们也可以模仿异常的来创建自己的异常来判断阻断,异常都是继承自Exception|RuntimeException,编译时|运行时异常
  • 增强程序健壮性只能解决程序的运行时异常
  • throw制造异常    |throws 抛出异常        |try{ } catch(声明异常 ){  } finally{} 捕获异常    finally不管有没有异常都会执行的代码,catch可以有多个用于捕获多个异常,大范围的异常放在后面.不然后面的小捕获就是不可达语句
  • catch (Exception e){

                System.out.println("接盘侠出现了..."); //可以捕获所有的异常,放在最后面,接盘侠啊

            }

  • 对于try catch 而言,try中放置的是可能发生的异常,当真正发生异常时候,执行对应异常的catch内容,try后面的内容都阻断了,不会发生

异常

 * 异常: exception

 *                   Throwable

 *               /                      \

 *        Error                         Exception

 *            |                       /                       \

 *     UnChecked        Checked        Runtime        

 *     Exception          Exception        Exception

 * 异常分为编译时异常和运行时异常

 * Error: 一般是由虚拟机生成并脱出的,程序员不关注

 * Exception : 异常,一旦出现异常,如果不解决,程序无法继续向下执行

 *     检查时异常|编译时异常:编译期出现的异常,如果不处理,程序无法运行

 *     运行时异常: 出现在程序运行期间,可以通过程序的健壮性处理

 * 

 *     常见的运行时异常:

 *         1.类型转换异常

 *         2.空指针异常

 *         3.数组索引越界异常

 *         4.数组长度负数异常

 *         5.数学异常 ArithmeticException

 *         6.转换异常 NumberFormatException

异常处理

 *     throw : 制造异常 

 *     处理异常的方式:  *********

 *         throws : 抛出异常

 *         try..catch :捕获异常

 *             try {

                可能会出现异常的代码;

            } catch (FileNotFoundException e) {

                如果出现这个异常会执行的代码;

                e.printStackTrace();  //打印异常的栈信息,标红色的打印异常信息

            } catch (NullPointerException e){

                如果出现这个异常会执行的代码;

            }.....

            finally{

                无论是否出现异常,都会执行finally中的代码

            }

            如果一旦try中出现异常了,try中后面的代码都不会执行了

            一个try后面可以跟一个或者多个catch

            如果多个catch,大范围的在后面

 自定义异常

 *     不是java提供的异常类,根据自己的逻辑业务进行定义,合理的地方使用,注意要直接或者间接继承异常Exception

public class DefinedException01 {
	public static void main(String[] args) {
		Person p = new Person();
		p.setName("yinwei");
		try {
			p.setAge(200);
		} catch (AgeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(p);
	}
}


//自定义异常类
//直接或者间接的继承自Exception
//运行时异常必须直接或者间接继承自RuntimeException
//当出现年龄不合法问题(<0||>150),会抛出这个异常

//创建一个异常类名字叫年龄异常,继承Exception
class AgeException extends Exception{
	public AgeException() {            //这是异常类的一个空构造
		super();
	}
	
	public AgeException(String s) {   //这是利用父类的异常处理机制返回一个字符串提示错误信息
		super(s);
	}
	
}


class Person {                         //定义一个类
	private String name;                //类的参数
	private int age;                    //类的参数
	
	public Person() {                    //空构造方法
		// TODO Auto-generated constructor stub
	}

	public Person(String name, int age) {  //类的全参构造
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) throws AgeException{        //设计异常
		if(age<0 || age>150){
			//也可以是throw new  AgeException();  这样就不会有异常提示信息
			throw new  AgeException("有异常了,这里是异常的提示信息");
		}
		this.age = age;
	}
                                                            //重写toString方法
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}
           

运行结果:   //可以看出来,没有赋值成功,并且向下运行了 ,因为捕获处理了异常

com.shsxt.exception01.AgeException: 有异常了,这里是异常的提示信息

    at com.shsxt.exception01.Person.setAge(DefinedException01.java:70)

    at com.shsxt.exception01.DefinedException01.main(DefinedException01.java:16)

Person [name=yinwei, age=0]