11.异常处理

final

1.可以修饰变量:称为常量

1.常量:指在程序运行过程中不能被改变的量.
2.常量的使用场合:同一声明不允许改变的公共信息,例如:表名和提示信息
[注意]:

  • 局部常量:先声明,再赋值,一旦赋值后,不允许再次赋值
  • 成员常量:声明的同时就必须赋值

2.可以修饰方法:最终方法,不允许子类重写的方法

[说明]:只要子类继承了父类中的方法(普通方法,虚方法,抽象方法),在子类中就可以重写
[问题]:子类中可否重写父类的构造方法?
:

不能.只能在子类的构造方法的第一条语句去调用父类构造方法.

3.可以修饰类:最终类,不允许有子类(例如String)


异常处理

什么是异常?
答:程序在运行过程中由于 设备硬件原因,及程序设计缺陷等原因造成的程序不能正常运行的情况。

一.Java异常分类

1.运行时异常:在编码及编译过程中不会发生,在运行过程中产生的异常
2.非运行时异常:在编码的过程中就检测到的异常。


二.Java异常处理机制:

异常家族:

Exception 是所有异常类的父类:
getMessage():返回的字符串-异常原因
printStackTrace() 打印出方法在堆栈调用过程中的异常信息,包括getMessage()中的信息
ArithmeticException 算术异常-数学计算过程中异常
InputMismatchException输入类型不匹配异常-没有重写父类中的getMessage()返回值null
NullPointerException 空指针异常
ArrayIndexOutOfBoundsException 索引越界异常
IOException 文件输入输出异常
NumberFormatException 把字符串转换成数值类型时发生的异常
ClassCastException 把一个子类强转成其它类型时的异常

1.方式一:捕获异常(try-catch-finally)

语法:

try{
       //可能会发生异常的代码
       //代码1
       //代码2  当执行到代码2时发生异常,JVM会根据产生异常的原因,创建一个异常对象
                【注意】try中代码2之后的代码将不会被执行到
       //代码3

    }catch(异常类型 变量){   直接执行catch  
                             catch中的异常类型是否是异常对象对应的类型
                             如果异常对象和捕获的类型一致,则进行异常处理,执行catch中的代码
                             如果不一致,则不会被处理
       //异常处理代码
    }finally{
       //处理内存的销毁工作  ,finally中的代码无论有无异常都会被执行
    }

1.1进行多路捕获:

 语法
   try{

   }catch(异常类型1 ex){

   }catch(异常类型2 ex){

   }catch(异常类型3 ex){

   }

[注意]:在多路捕获异常中,父类异常一定要出现在最后
原因:在捕获异常时,catch语句块从上到下,逐个判断,当某个catch中的异常类型进行捕获后,其余catch将不再进行判断

1.2.非运行时异常

  • 情况1:代码写完后无需编译、运行,直接报异常
  • 情况2:代码写完后,强制要求对代码进行异常捕获

ClassNotFoundException 类加载失败异常

  try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

【说明】

  • 1、即使在try或者catch中有return语句,那么在执行return之前,一定要先执行finally,然后再执行return.
  • 2、多路捕获异常的好处:明确具体的异常类型。

方式二:抛出异常throw-throws

通过throw引发异常,然后通过throws把引发的异常抛出,抛给调用者

package cn.cc.ex1;

/**
 * @author CC
 * throws 抛出异常
 */
public class ThrowDemo {
	//在方法()的后面通过throws关键字,把方法体内引发的异常抛出
	//throws抛出的异常类型必须和方法体内引发的异常类型一致,或者是父类Exception
	public void test() throws Exception{
		System.out.println("测试方法");
		//自己引发异常
		throw new IndexOutOfBoundsException("数组越界异常");
	}
}

测试类:

package cn.cc.ex1;

/**
 * @author CC
 * throws 抛出异常
 */
public class TestThrow {
	public static void main(String[] args) {
		ThrowDemo td = new ThrowDemo();
		try {
			td.test();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
}

抛出异常的使用场合:当不符合某种业务要求时,可以选择引发并抛出异常


java是采用面向对象的方式来处理异常的。处理过程:

  • 1.抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE
  • 2.捕获异常:JRE得到该异常后,寻找相应的代码来处理该异常。JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止

如何自定义异常类?

  • 自定义异常类extends Exception
  • 在子类的构造方法中把异常信息通过super()传递给父类Exception
  • 调用父类的getMessage(),返回的就是此信息

//自定义异常类:

package cn.cc.ex1;

public class PayException extends Exception{
	public PayException() {
		
	}
	
	public PayException(String message) {
		super(message);
	}
}

package cn.cc.ex1;

public class Pay {
	public void pay(float money) throws PayException{
		if (money<=0) {
			throw new PayException("支付的金额不能小于等于0");
			
		}else {
			System.out.println("您已成功支付:"+money);
		}
		
	}
}

测试类:

package cn.cc.ex1;

public class PayTest {

	public static void main(String[] args) {
		float money = -100;
		Pay pay = new Pay();
		try {
			pay.pay(money);
		} catch (PayException e) {
			System.out.println(e.getMessage());
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值