异常的概念
异常是指在程序执行时由于程序处理逻辑上的错误而导致程序中断的一种指令流。
从本质上来说异常就是一个对象,对象一定是在程序执行的过程中new出来的,异常一定是发生在运行期,和编译期间的语法错误区分开
不产生异常的代码
package com.qianfeng.day15;
public class Test03 {
public static void main(String[] args) {
System.out.println("main方法开始执行!!!");
int i = 1/1;
System.out.println("main方法结束执行!!!");
}
}

出现异常的程序
package com.qianfeng.day15;
public class Test03 {
public static void main(String[] args) {
System.out.println("main方法开始执行!!!");
int i = 1/0;
System.out.println("main方法结束执行!!!");
}
}

异常的体系结构

Error称为运行时错误,这种错误一旦发生程序员将无法做出提前的处理,只能停止程序的执行,开发中对于这样的问题只能尽量避免(了解即可)
Exception:异常,和Error不同,异常可以在程序中做出提前的处理(重点)
Exception异常又分为两个派系
- 继承了RuntimeException,这种异常称为“运行时异常”
- 其他不是直接或者间接继承RuntimeException类的异常成为"编译时异常"
上面说的编译时异常指的是编译时必须要处理的异常,并不是发生在编译期的异常,异常一定发生在运行期
之所以要分为这两种异常是因为:运行时异常出现的概率较小并不需要强制处理,而编译时异常出现概率较大,很有可能出现,所以编译期需要手动处理好。
异常处理的两种方式
1. throws处理方式
在程序执行的过程中往往会涉及不同类中方法的调用,而为了方便调用者进行异常的处理,往往会在这些方法声明时对可能产生的异常进行标记,此时就需要通过throws关键字来实现。
package com.qianfeng.day15;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class ThrowsTest {
public static void main(String[] args) throws FileNotFoundException {
method1();
System.out.println("main方法执行结束!!!");
}
//运行时异常可以不抛出或解决,但会让jvm强制停止
private static void method1() throws ArithmeticException, FileNotFoundException{
// TODO Auto-generated method stub
System.out.println("method1方法执行开始!!!");
int i = 1/0;
method2();
System.out.println("method1方法执行结束!!!");
}
//编译时异常一定要处理(抛出或解决)
private static void method2() throws FileNotFoundException {
System.out.println("method2方法执行开始!!!");
//这种异常属于编译时异常需要手动解决
FileInputStream fis=new FileInputStream("D:/aaa.txt");
System.out.println("method2方法执行结束!!!");
}
}
最后如果在main方法的时候还通过throws来网上抛,那么将会直接抛到虚拟机,而由虚拟机来处理就是强制停止程序,让后面的代码没有执行的机会。
2. try-catch-finally处理方式
1. 基本语法
try{
//可能出现异常的代码
} catch(异常类型1 对象){
//异常处理1
} catch(异常类型2 对象){
//异常处理2
} catch(异常类型3 对象){
//异常处理3
} finally{
//不管是否出现异常最后都会执行的代码
}
2. try-catch、try-catch-finally、try-finally三种方式应用
package com.qianfeng.day15;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Try_CatchTest {
public static void main(String[] args) throws FileNotFoundException {
try{
method1();
} finally{
System.out.println("main方法执行结束!!!");
}
}
//运行时异常可以可以解决或不解决,解决时可以printStackTrace()输出异常结果
private static void method1(){
// TODO Auto-generated method stub
System.out.println("method1方法执行开始!!!");
try {
int i = 1/0;
} catch(ArithmeticException e) {
e.printStackTrace();
}
method2();
System.out.println("method1方法执行结束!!!");
}
//编译时异常一定要处理(抛出或解决),解决时可以printStackTrace()输出异常结果
private static void method2(){
System.out.println("method2方法执行开始!!!");
try {
FileInputStream fis=new FileInputStream("D:/aaa.txt");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
System.out.println("一定会执行的代码");
}
System.out.println("method2方法执行结束!!!");
}
}
代码运行截图

3. 两种异常处理的比较
throws这种方式优势处理过程简单,从异常发生的那个位置开始往下的代码不再执行了,
try catch这种方式是在发生异常的方法的内部进行异常的显示处理,处理完成后方法后续的代码可以继续执行
在实际的项目开发中,两种方式结合到一起来使用,项目任何一个地方只要发生了异常不要自己去做try catch处理,统一往上进行抛出,最后所有的异常到达统一的处理中心,然后在这个处理中心中对所有的异常进行统一的处理
4. 异常处理的细节说明
- 在异常处理中try-catch语句中catch语句虽然可以有多个,但是上层的catch异常类型不能是下层的父类。
- finally中语句一般都会执行,除非遇到System.exit(0)才会停止,就算在try中遇到return都会执行其中的代码。
- 子类在重写父类的方法时不能抛出比父类的方法更大或者更多的异常。因为多态是编译看父类,运行看子类。
- try不能独自出现,要配合catch和finally使用。
自定义异常类
虽然JAVA为我们编写程序提供了非常丰富的异常类型,但都是通用的,实际的开发中我们需要定义自己的异常类型
定义的步骤:
- 异常是一个类型,创建一个class,类名必须以Exception结尾
- 从Exception或者RuntimeException继承,自定义异常一般都是从RuntimeException继承
- 在自定义异常类中提供一些属性封装异常的信息
package com.qianfeng.day15;
public class User_DefinedTest {
public static void main(String[] args) {
try {
SuperNumber.superNumber(100000);
} catch (BombException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
}
class BombException extends Exception{
public BombException(String ex) {
super(ex);
}
}
class SuperNumber{
public static void superNumber(int num) throws BombException{
if(num > 10000) {
throw new BombException("数字过大");
} else {
System.out.println("数字正常");
}
}
}

被折叠的 条评论
为什么被折叠?



