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());
}
}
}