java异常的基本概念

异常
异常是导致程序中断你的运行的一种指令流,如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失,所以在程序的设计中必须要考虑到各种异常的发生,并正确的做好相应的处理,这样才能保证程序的正确执行

public class ExceptionDemo01 {
public static void main(String[] args) {
System.out.println(“*计算开始***“);
int i = 10;
int j = 0;
int temp = i/j; //此处产生异常
System.out.println(temp);
System.out.println(“*计算结束***“);
}
}
运行结果:*计算开始***
Exception in thread “main” java.lang.ArithmeticException: / by zero
at Exp.ExceptionDemo01.main(ExceptionDemo01.java:8)
一旦产生异常之后,异常之后的语句并不会执行,而是直接结束程序,并将错误报告给用户
在计算机的发展史有两大杀手
*断电
*被除数为0

处理异常
try{
//有可能出现异常的语句
}catch(异常类异常对象){
//编写异常的处理对象
}catch(异常类的处理语句){
//编写异常类的处理语句
}catch(异常类的处理语句){
//编写异常类的处理语句
}finally{
//一定要运行到的程序代码

public class ExceptionDemo02 {
public static void main(String[] args) {
System.out.println(“*计算开始***“);
int i = 10;
int j = 0;
try {
int temp = i/j; //此处产生异常
System.out.println(temp);
System.out.println(“——————–”);
}catch(ArithmeticException e) {
System.out.println(“出现异常了”);
}

    System.out.println("****计算结束******");
}

}
运行效果:*计算开始***
出现异常了
*计算结束***

以上的操作代码只使用了基本的异常处理格式:try…catch,try中捕获异常,出现异常之后的代码将不再被执行。而是跳转到相应的catch语句中,用于处理异常。
当然,对于异常也可以设置其同意的出口,使用finally完成。

public class ExceptionDemo03 {
public static void main(String[] args) {
System.out.println(“*计算开始***“);
int i = 10;
int j = 0;
try {
int temp = i/j; //此处产生异常
System.out.println(temp);
System.out.println(“——————–”);
}catch(ArithmeticException e) { //捕获算数异常
System.out.println(“出现异常了” + e);
}finally { //作为异常的统一出口
System.out.println(“不管处没出现异常,都将执行此代码”);
}
System.out.println(“*计算结束***“);
}
}
运行结果:
*计算开始***
出现异常了java.lang.ArithmeticException: / by zero
不管处没出现异常,都将执行此代码
*计算结束***

以上的程序只是在代码中处理了一个异常,如果现在有多个异常呢?
修改代码:修改输入i和j的内容
public class ExceptionDemo04 {
public static void main(String[] args) {
System.out.println(“*计算开始***“);
int i = 0;
int j = 0;
try {
String str1 = args[1]; //接受第一个参数
String str2 = args[2]; //接受第二个参数
i = Integer.parseInt(str1); //将第一个参数由字符串转化为整形
j = Integer.parseInt(str2); //将第二个参数由字符串转化为整形
int temp = i/j; //此处产生异常
System.out.println(temp);
System.out.println(“——————–”);
}catch(ArithmeticException e) { //捕获算数异常
System.out.println(“出现异常了” + e);
}finally { //作为异常的统一出口
System.out.println(“不管处没出现异常,都将执行此代码”);
}
System.out.println(“*计算结束***“);
}
}

上述代码中出现三个异常:
1.如果没有输入参数或者输入的参数不够,会出现问题。
2.如果现在输入的时候输入的不是数字,而是字母。
3.算数异常,如果被除数为0的话
如果想要保证程序的执行正确,则必须同时对三个异常进行处理,所以此时需要三个catch语句
public class ExceptionDemo05 {
public static void main(String[] args) {
System.out.println(“*计算开始***“);
int i = 0;
int j = 0;
try {
String str1 = args[1]; //接受第一个参数
String str2 = args[2]; //接受第二个参数
i = Integer.parseInt(str1); //将第一个参数由字符串转化为整形
j = Integer.parseInt(str2); //将第二个参数由字符串转化为整形
int temp = i/j; //此处产生异常
System.out.println(“两个数字相除的结果:” + temp);
System.out.println(“——————–”);
}catch(ArithmeticException e) { //捕获算数异常
System.out.println(“算数异常” + e);
}catch(NumberFormatException e) { //捕获数字转换异常
System.out.println(“数字转换异常:” + e);
}catch(ArrayIndexOutOfBoundsException e) { //捕获数组越界异常
System.out.println(“数组越界异常:” + e);
}
System.out.println(“*计算结束***“);
}
}
此代码完全解决了上述三个问题,当然程序还有可能存在其他异常。

异常类的继承结构
在整个java的异常结构中,实际上有以下两个最常用的类:Exception、Error,这两个类全都是Throwable的子类。
*Exception:一般表示的是程序中出现的问题,可以直接使用try…catch处理
*Error:一般指的是jvm的错误,程序中无法处理。
注意:
一般在输出异常信息的时候,可以直接使用syso打印异常对象
也可以通过Exception提供的一个方法:public void PrintStackTrace()

java的异常处理机制
在整个java异常处理中,实际上也是按照面向对象的方式进行处理,处理的步骤如下:
*一旦产生异常,则首先会产生一个异常类的实例化对象
*在try语句中对此异常对象进行捕捉
*产生的异常对象与catch语句中的各个异常类型进行匹配,如果匹配成功,则执行catch语句中的代码

通过对对象的多态性了解,子类的实例化对象可以直接使用父类的对象进行接受。
那么在异常处理中也是此种概念,因为try中产生的是一个实例化对象。如果现在有一些其他的异常没有被捕获,则可以使用Exception进行捕获。
public class ExceptionDemo06 {
public static void main(String[] args) {
System.out.println(“*计算开始***“);
int i = 0;
int j = 0;
try {
String str1 = args[1]; //接受第一个参数
String str2 = args[2]; //接受第二个参数
i = Integer.parseInt(str1); //将第一个参数由字符串转化为整形
j = Integer.parseInt(str2); //将第二个参数由字符串转化为整形
int temp = i/j; //此处产生异常
System.out.println(“两个数字相除的结果:” + temp);
System.out.println(“——————–”);
}catch(ArithmeticException e) { //捕获算数异常
System.out.println(“算数异常” + e);
}catch(NumberFormatException e) { //捕获数字转换异常
System.out.println(“数字转换异常:” + e);
}catch(ArrayIndexOutOfBoundsException e) { //捕获数组越界异常
System.out.println(“数组越界异常:” + e);
}catch(Exception e) {
System.out.println(“其他异常:” + e);
}
System.out.println(“*计算结束***“);
}
}
注意点:
在异常处理中,捕获更粗的异常要放在捕获更细的异常之前。

猜你喜欢

转载自blog.csdn.net/weixin_43149344/article/details/82746350