java 异常来了
异常就是Java程序在运行过程中出现的错误。
异常的继承体系
Throwable
* Error
* Exception
* RuntimeException
异常处理的两种方式
* a:try…catch…finally
* try catch
* try catch finally
* try finally
* b:throws
* try...catch的方式处理多个异常 但是第一个异常被捕获之后,就不再执行了
A:编译期异常和运行期异常的区别
* Java中的异常被分为两大类:编译时异常和运行时异常。
* 所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常
* 编译时异常
* Java程序必须显示处理,否则程序就会发生错误,无法通过编译
* 运行时异常
* 无需显示处理,也可以和编译时异常一样处理
/**
* * A:Throwable的几个常见方法
* a:getMessage()
* 获取异常信息,返回字符串。
* b:toString()
* 获取异常类名和异常信息,返回字符串。
* c:printStackTrace()
* 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
* B:案例演示
* Throwable的几个常见方法的基本使用
*/
Throws 方法的处理
/**
* * A:throws的方式处理异常
* 定义功能方法时,需要把出现的问题暴露出来让调用者去处理。
* 那么就通过throws在方法上标识。
* B:案例演示
* 举例分别演示编译时异常和运行时异常的抛出
* 编译时异常的抛出必须对其进行处理
* 运行时异常的抛出可以处理也可以不处理
* @throws Exception
*/
finally 特点就是
/**
* * A:finally的特点
* 被finally控制的语句体一定会执行
* 特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))
* B:finally的作用
* 用于释放资源,在IO流操作和数据库操作中会见到
* C:案例演示
* finally关键字的特点及作用
*return语句相当于是方法的最后一口气,那么在他将死之前会看一看有没有finally帮其完成遗愿,如果有就将finally执行
*后在彻底返回
*/
class Finally_Demo{
public static void main(String[] args) {
try {
System.out.println(10/0);
} catch (Exception e) {
System.out.println("除数为零了");
//System.exit(0); // 这条语句是退出jvm虚拟机
return;
} finally {
System.out.println("看看我执行了吗");
}
}
}
执行结果:
除数为零了
看看我执行了吗
throw的概述
* 在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
* C:throws和throw的区别
* a:throws
* 用在方法声明后面,跟的是异常类名
* 可以跟多个异常类名,用逗号隔开
* 表示抛出异常,由该方法的调用者来处理
* b:throw
* 用在方法体内,跟的是异常对象名
* 只能抛出一个异常对象名
* 表示抛出异常,由方法体内的语句处理
自定义异常类
1)首先创建自定义异常类,语法格式:自定义异常类名 extends Exception。
2)在方法中通过关键字throw抛出异常对象。
3)若是在当前抛出异常的方法中处理异常,可以用try-catch语句捕获并处理;若不是,在方法的声明处通过关键字throws指明要抛出给方法调用的异常。
4)在出现异常方法的调用中捕获并处理异常。
例子:
class NumeratorIsZeroException extends Exception
{
public NumeratorIsZeroException(String msg)
{
super(msg);
}
}
public class Number
{
public int divition(int iNum1,int iNum2) throws NumeratorIsZeroException
{
if(0 == iNum2)
{
throw new NumeratorIsZeroException("分子不能为零。");
}
return (iNum1/iNum2);
}
}
运行:
public class Test
{
public static void main(String[] args)
{
Number num = new Number();
try
{
System.out.println("商:" + num.divition(12,0));
}
catch(NumeratorIsZeroException e)
{
System.out.println(e.getMessage());
e.printStackTrace();
}
catch(Exception e)
{
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
运行结果:
妃子不能为0
com.heima.exception.NumeratorIsZeroException: 妃子不能为0
at com.heima.exception.Number2.divition(Number2.java:6)
at com.heima.exception.Test.main(Test.java:9)