JAVASE(十三) 异常处理

1、异常体系结构

说明:

|-----Throwable
|-----Error :没针对性代码进行异常的处理

|-----Exception :针对性代码进行异常处理
                  |-----编译时异常 : 代码在编译的时候发生的异常(必须进行处理否则无法运行)
                      |----ParseException
 
                  |-----运行时异常 : 代码在运行时发生的异常
                      |-----NullPointerException
                      |-----ClassCastException
                      |-----IndexOutofBoundsException

2、异常的处理

格式 :

try{
    可能会发生异常的代码
 }catch(异常的类型   e(变量名)){
      关于该异常的处理方式;
 }finally{
      一定会执行的代码;
 }

说明:

  1. finally是可的,finally中的代码一定会执行
  2. 当try中的代码发生异常时,会根据对应的异常类创建相应的对象,并将异常向外抛出。根据catch后面的异常类型进行匹配,一旦匹配成功则执行catch对应的异常处理方式。异常处理的代码执行完毕则跳出try-catch结构,继续向下执行其它的代码。一旦匹配不成功则抛出异常程序终止。
  3. 可以多个catch,如果多个catch后面的异常类型是子父类关系那么应该(子类在上父类在下)如果是兄弟可系谁上谁下都可以。
  4. catch可以省略不写,但必须要try-finally组合。目的是发生异常不处理,但一定要执行某些代码
  5. 输出异常信息 : ①getMessage()  ②printStackTrace()
  6. 在try声明的变量在try-catch结构外访问不到。因为作用域的问题。

finally:

  1. 就算catch中发生了异常,finally也一定会执行。
  2. 就算catch中有return,finally中的代码也一定会执行。
public int getNumber3(){
		int a = 10;
		try {
			return a;
		} catch (Exception e) {
			
		}finally{
			a++;
			return a;
		}
	}
	
	public int getNumber2(){
		int a = 10;
		try {
			return a;
		} catch (Exception e) {
			
		}finally{
			a++;
//			return 30;
		}
		return 30;
	}
	
	public int getNumber(){
		try {
			System.out.println(1 / 0);
			return 10;
		} catch (Exception e) {
			return 20;
		}finally{
			System.out.println("aaaaa");
			return 30;
		}
	}

代码:

             try{
			System.out.println("aaa");
			System.out.println("bbb");
			System.out.println(1 / 0);
		}catch(NullPointerException e){
			System.out.println("空指针异常");
		}catch(IndexOutOfBoundsException e){
			System.out.println("下角标越界");
		}catch(RuntimeException e){
			System.out.println("算术运算异常");
		}finally{
			System.out.println("我是一定会执行的代码");
		}
		System.out.println("程序执行完/毕");


2.2 throws

格式 :方法名() throws 异常类型1,异常类型2...{}
throws :抓到异常后自己不处理直接向上抛,抛给方法的调用者。


throws和try-catch-fianlly的区别?

  1. try-catch-finally真正的处理了异常

  2. throws没真正的处理异常,只是将异常向上抛,抛给方法的调用者,最后还是需要try-catch真正的处理异常

    扫描二维码关注公众号,回复: 9078025 查看本文章

throws和try-catch-finally的使用场景?

  1. 需要真正解决异常时需要使用try-catch
  2. 必须使用throws : 在main方法中如果需要连续的调用多个方法,每个方法都有可能需要处理异常,那么方法中的异常建议向上抛,抛给方法的调用者。(比如买飞机票输入身份证号的问题)
  3. 一定不能使用throws : 子类继承父类后。父类被重写的方法没有抛异常,那么子类重写的方法也不能抛出异常

(详见ThrowsTest2.java)

2.3 手动抛出异常类对象 – throw

抛 :
java程序在正常执行的过程中,一旦执行到某行代码发生了异常,系统会根据对应的异常类创建相应的对象并向外抛出,抛出给调用者。同时终止程序的运行。
①系统向外抛异常    ②手动向外抛异常
格式 :

throw new 异常类型();

2.4自定义异常类

代码:

  1. 继承Exception或RuntimeException
  2. 提供重载的构造器。一个无参,一个有参
  3. 提供一个序列版本号(讲IO流再说)

代码:

public class MyException extends RuntimeException{
	
	/*
	 * 也可以不写,系统会自动帮我们生成一个序列版本号
		建议手动添加
	 */
	private static final long serialVersionUID = -75646546882580L;

	
	public MyException(){
		
	}
	
	public MyException(String message){
		super(message);
	}
}
发布了222 篇原创文章 · 获赞 60 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_42405670/article/details/103915485
今日推荐