J2SE第四章——异常(二)

新知识点:

1.共有5个关键字 4个已学 try catch throw throws   

       问题:

        1.如果不抛异常,则顺序执行,但越过catch语句块,然后往下执行catch之后的语句块

        2.如果try中的代码抛出了异常,那么try中余下的代码还执不执行?          -------不执行

2 跳转到相应的catch语句块中,执行catch里面的代码

         如果catch语句块使用了throw,那么throw后的语句(无论是在catch语句之中还是catch语句之后)不再执行

         确保代码一定能够执行  finally 

try {

} catch () {

} finally {

}

3.一张图:(组织关系图): 很多异常类----OOP  继承  父类  Object

类:                                           Throwable

                   有两个分支                       Error                                      Exception

                                                        (系统环境错误)               (程序员违背了某种规则)

                                                                                    ..... RuntimeException .....

                                                       ArithmeticException  ArrayIndexOutofBoundsException  NullPointerException

 

 

                  try : 可能发生异常的代码要封装在try语句块中  会增加代码量。设计师把一些经常发生的异常进行“处理”,这些代码可以不用放在try 中。RuntimeException 中的异常可以不用写在try语句中

public class B {
	public static void main(String[] args) {

	}

	public static void m1(int a) {
		int result = 0;
		int[] arr = {1,2,3};
		String str = null;
		//String str = new String();

		result = 10/0;	//ArithmeticException
		System.out.println(arr[4]);	  //ArrayIndexOurofBoundsException

		Str.split(",");	//NullPointerException
	}
} 

4.先捉小的,后捉大的      

     如果try 语句块抛出多种异常,那么:

      4.1 规范格式:用catch 分别捕捉-----catch语句块的顺序

     是不是抛出异常的顺序?

      ---不是~!因为try抛出异常,JVM 会跳转到相应的catch 执行

       catch捕捉到的多个异常类,如果存在“继承”关系,必须考虑“父类-子类”的顺序问题:

      父类异常:位于子类异常的后面:------没有问题

      父类异常:位于子类异常的前面:------不行!因为后面的子类异常永远都没有机会执行

try {
	result = 10/0;
	System.out.println(arr[5]);
	Str.split(",");
}catch (NullPointerException e) {

} catch (ArrayIndexOutofBoundsException e) {

} catch (ArithmeticException e) {

} catch (RuntimeException e) {	//父类

}


5. 自定义异常 

         模拟登陆  输入用户名zs,  提示正确,否则提示错误。 

         自定义异常 封装用户名不正确信息

          语法:

               继承自Exception(必须写 try catch)/ RuntimeException(可以不写 try catch )

================继承自Exception=======================

class UsernameNotFoundException extends Exception {
	// className nethodName linenumber (前三者都不能确定)info 

	public UsernameNotFoundException(String info ) {
		super(info);
		//super("用户名不存在");
	}
}
			
public class B {
	public static void main(String[] args) {
		try {
			login();
		} catch (Exception e) {
			System.out.println("用户名不正确");
		}
	}

	//登陆
	public static String  login() throws Exception{
		String name = getName();

		if ("zs".equals(name) {
			System.out.println("登陆成功");
		} else {	//登陆不成功,认为是运行期错误---异常  -JDK 没有内置“用户名错误”的异常---已定义异常
			Exception e = new UsernameNotFoundException();
			throw e;					
		}

	//键盘输入用户名
	public static String getName() throws Exception {
		return new BufferedRead(new InputStreamReader(System.in)).readLine();
	}
}
=====================继承自RuntimeException=============================

class PasswardErrorException extends RuntimeException {
	public PasswardErrorException(String info) {
		super(info);
	}
}

public class Test {
	public static void main(String[] args) {
		checkPwd();	 //受控异常  不用写try  catch 

		/*
		try {
			checkPwd();
		} catch (PassWardErrorException) {
			System.out.println("密码错误");
		}
		*/	
		}

	public static void checkPwd() {
		if ("123".equals(pwd)) {
			System.out.println("跳转到成功页面");
		} else {
			throw new PassWardErrorException("密码错误");
		}
	}

	public static String getPwd() {
		String str = null;

		try {
			str = new BufferedRead(new InputStreamReader(System.in)).readLine();
		} catch (IOException e) {

		}
	}
}




你可能感兴趣的:(J2SE第四章——异常(二))