在程序中会出现各种错误我们叫做异常.
下面介绍一下如何处理可能会出现的异常.
导致程序中断的错误如下
Error: JVM出错了
不能处理,程序无法恢复
Exception : 代码逻辑错误,编程不严谨导致的 或者其他偶然的因素
可以处理,程序还能继续运行
运行时异常(unchecked): 编译器不要求我们处理的错误
异常(checked): 编译器要求我们必须处理的错误
创建一个Exception类,实现异常处理
public class ExceptionTest {
public void tryCatchTest(int a,int b){
// 使用try-catch捕获和处理异常
try {
// 可能会产生异常的代码
System.out.println("准备开始除法计算");
int c = a/b;
System.out.println("除法计算正常运行");
String text = null;
int length = text.length();
} catch (ArithmeticException e) {
// try中产生异常以后,对异常进行处理
// e就是捕获到的异常对象
// 只要捕获到异常,程序就不会终止,继续向下执行
// try中没有产生异常,catch中的代码
System.out.println("程序产生异常");
// 通常不适用Exception,而是使用具体的异常类型,让异常处理更具有针对性
// 获取异常的描述信息
System.out.println(e.getMessage());
// 打印异常产生的堆栈信息,方法调用过程,异常的位置
e.printStackTrace();
} catch (NullPointerException e) {
// catch可以有多个,每个catch只处理一个异常
System.out.println("产生了空指针异常");
}finally {
// finally是可选的,可写可不写
// 无论是try还是catch执行完后都不会执行这里的代码
System.out.println("finally执行了");
}
}
// 声明方法时,可以通过throw说明当前可能产生的异常
// 方法抛出异常,方法内不产生的异常不处理,抛调用方法来处理
public void throwTest() throws ArithmeticException{
int a = 10;
int b = 0;
int c = a / b;
}
public void addNumber(int a) throws NumberException{
// 要求输入数字a<10
if (a>10) {
// 运行时异常由系统抛出
// 自定义异常都是继承自Exception的 ,
// 需要使用throw关键字手动抛出
// 告诉方法的调用者,方法执行过程的各种产生错误,该如何处理
throw new NumberException("你输入的数字大于10");
}
int b = a * 10;
}
}
创建Text类, 调用.
public class Test {
public static void main(String[] args) {
// 空指针
// String text = null;
// int length = text.length();
// 数组越界
// int[] a = new int[5];
// a[10] = 10;
// 必须处理的异常,不处理就报错
// FileInputStream fis = new FileInputStream("文件路径");
// 处理异常的两种形式
// 1.使用try-catch-finally语法处理
// 自己处理
// 2.使用throw和throws关键字交给方法的调用者进行处理
// 交给别人处理
// 抛出(throw)异常: 当我们程序运行产生异常,会自动生成异常对象,提交给JVM
// 捕获(catch)异常: JVM收到异常对象后,自动寻找能够处理这个异常的代码,并把异常对象交给他
// 如果找不到处理这个异常的代码,程序就崩溃 终止运行
ExceptionTest et = new ExceptionTest();
// et.tryCatchTest(10, 0);
System.out.println("程序运行结束!");
// 方法如果抛出普通异常,调用者必须使用try-catch捕获
// 通过自定义异常告诉方法的调用者,出错的原因,由方法的调用者捕获异常决定如何处理
try {
et.addNumber(5);
} catch (NumberException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// 或者只打印错误类型 (就是写的那句话)
System.out.println(e.getMessage());
}
}
}
下边是自定义异常
创建一个class 继承自Exception 并点击创建构造方法
这个类的使用在上边的ExceptionTest类中的addNumber方法上,可参考上边使用.
// 自定义异常 继承自Exception
// 并不是所有会导致程序崩溃的错误叫做异常
// 所有不符合预期效果的现象都可以叫做异常
public class NumberException extends Exception{
public NumberException() {
super();
// TODO Auto-generated constructor stub
}
public NumberException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
// TODO Auto-generated constructor stub
}
public NumberException(String message, Throwable cause) {
super(message, cause);
// TODO Auto-generated constructor stub
}
public NumberException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
public NumberException(Throwable cause) {
super(cause);
// TODO Auto-generated constructor stub
}
}