Java 第八章 异常(2)
目录
编辑
异常处理
捕获异常
基本语法
实例
声明异常
注意:
实例
抛出异常
实例
运行期异常和编译期异常
自定义异常
定义
基本语法
注意
实例
异常处理
●Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws
捕获异常
- try 执行可能产生 异常的代码
- catch 捕获异常
- finally 无论是否发生异常, 代码总能执行
基本语法
1.try{
可能会发生异常的代码
}catch(异常类型 引用名){
异常处理代码
}
2.try{
可能会发生异常的代码
}catch(异常类型 引用名){
异常处理代码
}finally{
必须执行代码
}
实例
try{//可能出现异常的代码
int a = 10;
int b = 0;
System.out.println(a/b);
}catch (ArithmeticException a){//捕获对应类型的异常,在catch中执行处理程序,执行完,后续程序可以继续执行
System.out.println("除数不能为0");//向用户做出提示
a.printStackTrace();//打印抛出的异常对象信息
System.out.println(a.getMessage());//获取异常原因
}catch (ArrayIndexOutOfBoundsException ae){
System.out.println("数组索引越界");
System.out.println(ae.getMessage());
ae.printStackTrace();
}catch (Exception e){
System.out.println("系统忙,请稍后再试");
}
System.out.println("后续程序");
}
FileInputStream inputStream= null;
FileOutputStream outputStream=null;
try {
inputStream = new FileInputStream("E:/a.txt");
outputStream = new FileOutputStream("E:/B.txt");
int b = 0;
while ((b = inputStream.read())!=-1){
outputStream.write(b);
}
} catch (FileNotFoundException e) {
System.out.println("文件不存在");
}catch (IOException e){
System.out.println("文件中断");
}finally {//必须执行的代码块
if (inputStream!=null){
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
声明异常
-
throws 声明方法可能要抛出的各种异常(定义一个方法的时候可以使用throws关键字声明,表示此方法 不处理异常,而交给方法调用处进行处理)
eg.
public void test() throws 异常1,异常2,异常3{
}
注意:
- 任何方法都可以使用throws关键字声明异常类型,包括抽象方法。
- 调用使用了throws的方法时必须处理声明的异常,要么使用try-catch,要么 继续使用throws声明。
- 如果抛出的是运行期异常,则不会有任何提示,需要查看所调用的方法结构
实例
/*
throws关键字在方法参数列表后,用于声明此方法中有可能抛出哪种类型都异常,此方法不处理
谁调用谁处理
*/
public static void main(String[] args) {
try {
testA();
} catch (UnsupportedEncodingException e) {
System.out.println("编码异常");
} catch (ArrayIndexOutOfBoundsException e){
System.out.println("数组越界");
}
System.out.println("aaaaaaaaa");
}
public static void testA() throws UnsupportedEncodingException {
testB();
}
public static void testB() throws UnsupportedEncodingException {
"abc".getBytes("utf-888");
int [] a= {1,2,3,4};
a[5]=5;//此方法中有数组操作
}
抛出异常
- throw 手动抛出异常用于显式抛出异常,抛出的时候是抛出的是一个异常类的实例化对象.
语法:throw new 异常类构造方法
实例
public static void main(String[] args) {
try {
get(-1);
}catch (ArrayIndexOutOfBoundsException a){
System.out.println(a.getMessage());
}
}
/*
throw 在方法体中,当不满足某种条件时,主动的抛出一个异常对象
此时方法中按出现异常对待,方法不在往下执行
*/
public static int get (int index){
int []arr = {1,2,3,4,5};
if (index<0||index>=arr.length){
throw new ArrayIndexOutOfBoundsException("非法的数组索引:"+index);
//当索引条件不满足需求时,主动在方法中抛出一个异常对象,方法不在往下执行
}
return arr[index];
}
运行期异常和编译期异常
● 异常分为运行期异常和编译期异常两种
● 编译时期异常(即checked异常、受检异常):在代码编译阶段,编译器就能明确警示当前代码可能发生XX异常,并明确督促程序员提前编写处理它的代码。如 果程序员没有编写对应的异常处理代码,则编译器就会直接判定编译失败,从而 不能生成字节码文件。
● 运行时期异常(即runtime异常):在代码编译阶段,编译器完全不做任何检查, 无论该异常是否会发生,编译器都不给出任何提示。只有等代码运行起来并确实 发生了XX异常,它才能被发现。
java.lang.RuntimeException类及它的子类都是运行时异常。
比如: ArrayIndexOutOfBoundsException数组下标越界异常,
ClassCastException 类型转换异常
自定义异常
定义
自定义异常就是自己定义的异常类,也就是API中的标准异常类的直接或间接的子类
作用:用自定义异常标记业务逻辑的异常,避免与标准异常混淆
基本语法
public class 异常类名 extends Exception/RuntimeException{
public 异常类名(String msg){
super(msg);
}
}
注意
- 自定义异常类中往往不写其他方法,只重载需要使用的构造方法
- 继承Exception,在方法中使用throw抛出后,必须在方法中try-catch或 throws抛出
实例
/*
自定义异常,
在业务逻辑中,当不满是某种条件时,可以根据需要自定义对应的异常类型,与api中标准异常进行区分
*/
public class ScoreException extends Exception {
public ScoreException(String message){
super(message);
}
}
public class Dom7 {
public static void main(String[] args) {
try {
print(101);
}catch (ScoreException s){
System.out.println(s.getMessage());
}
}
public static char print(int score) throws ScoreException {
if ( score <0||score>100) {
throw new ScoreException("分数不合法:"+score);
}
if (score >= 90) {
return 'A';
} else if (score>=75 && score<90) {
return 'B';
} else if (score>=60 && score<75) {
return 'C';
}
return 'D';
}
}