java学习之路:29.异常处理

举报
花狗Fdog 发表于 2021/05/26 15:00:56 2021/05/26
【摘要】 文章目录 一.异常概述二.常见异常三.捕捉异常1. try-catch 语句块2.finally 语句块 四.自定义异常五.在方法中抛出异常1.使用throws关键字抛出异常2.使用throw关键字抛出异常 一.异常概述 学习Java时,常常会遇到编译程序后,提示出现异常,异常时一个在程序执行期间发生的事件,它中断了正在执行的程序的正常指令流...

在这里插入图片描述

一.异常概述

学习Java时,常常会遇到编译程序后,提示出现异常,异常时一个在程序执行期间发生的事件,它中断了正在执行的程序的正常指令流。
例如下面的代码:

public class Exceptiontest { public static void main(String[] args) { int num=3/0; System.out.println(num); }
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5

运行结果提示算术异常:
在这里插入图片描述
程序运行过程中发生了异常,系统不再执行下去,提前结束,这就是异常。
Java语言是一门面向对象的编程语言,因此,异常在Java语言中也是作为类的实例的形式出现的。当某一方法中发生错误时,这个方法就会创建一个对象,并且把它传递给正在运行的系统,这个对象就是异常对象。通过异常处理机制,可以将非正常情况下的处理代码与程序的主逻辑分离,即在编写代码主流程的同时在其他方法处理异常。
常见的异常如下。

二.常见异常

异常类 说明
ClassCastException 类型转换异常
ClassNotFoundException 没找到相应类异常
ArithmeticException 算术异常
ArrayIndexOutOfBoundsException 数组下标越界异常
ArrayStoreException 数组中包含不兼容的值抛出的异常
SQLException 操作数据库异常类
NullPointerException 空指针异常
NoSuchFieldException 字段未找到异常
NoSuchMethodException 方法未找到抛出的异常
NumberFormatException 字符串转换为数字抛出的异常
NegativeArraySizeException 数组元素个数为负数抛出的异常
StringIndexOutOfBoundsException 字符串索引超出范围抛出的异常
IOException 输入输出异常
IllegalAccessException 不允许访问某类异常
InstantiationException 当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常。
EOFException 文件已结束异常
FileNotFoundException 文件未找到异常

三.捕捉异常

Java语言的异常捕捉结构由try,catch,finally三个部分构成,其中try语句块中存的是可能发生异常的Java语句,catch程序块在try语句块之后,用来激发被捕捉的异常,finally语句块是异常处理结构的最后执行部分,无论try语句块中的代码如何退出,都将执行finally语句块,异常处理器大致分为 try-catch 语句块和 finally 语句块。

1. try-catch 语句块

将代码稍稍改动:

public class Exceptiontest { public static void main(String[] args) { int num=3/0; System.out.println(num); System.out.println("继续运行"); }
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

运行可知,一旦出现异常会终止出现运行。
在这里插入图片描述
在添加了异常处理tyr-catch语句块之后:

public class Exceptiontest { public static void main(String[] args) { try { int num=3/0; System.out.println(num); }catch(Exception e) { e.printStackTrace(); } System.out.println("继续运行"); }
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

运行结果可以看出,程序仍然输出最后的提示信息,没有因为异常而终止。
在这里插入图片描述

Exception是try代码块传递给catch代码块的变量类型,e是变量名,catch代码块中的语句“e.printStackTrace()方法用于指出异常的类型,性质,栈层次已经出现在程序中的位置。”另外两个方法如下:
getMessage() : 输出错误性质
toString() : 给出异常的类型与性质。

2.finally 语句块

完整的异常处理语句一定要包含finally语句,无论程序中有无异常发生,并且无论之间的try-catch 语句块是否顺序执行完毕,都会执行finally语句。
在以下4种特殊情况下,finally块不会被执行:

在finally语句中发生了异常
在前面的代码中使用了System.exit()退出程序
程序所在的线程死亡
关闭CPU

四.自定义异常

除了内置的异常类,用户也可以自定义异常,只需要继承Exception类即可。
步骤如下:
1.创建自定义异常类。
2.在方法中通过throw关键字抛出异常对象。

3.如果在当前抛出异常的方法中处理异常,可以使用try-catch语句块捕捉并处理,否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。

4.在出现异常的调用者中捕捉并处理异常。

例如:

//创建自定义异常类
class MyException extends Exception{ public MyException(String ErrorMessage) { super(ErrorMessage); }
}

//在方法中通过throw关键字抛出异常对象

public class Exceptiontest { static int avg(int number1,int number2) throws MyException{ if (number1 < 0 || number2 < 0) { throw new MyException("不可以使用负数"); } if (number1 > 100 || number2 > 100) { throw new MyException("数值太大了"); } return (number1 + number2); } public static void main(String[] args) { try { int num =avg(155,155); System.out.print(num); }catch(MyException e) { System.out.println(e); } }
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

运行结果:
在这里插入图片描述

五.在方法中抛出异常

1.使用throws关键字抛出异常

throws 关键字通常被应用在声明方法时,用来指定方法可能抛出的异常,多个异常可使用逗号分隔。
如:

int avg(int number1,int number2) throws MyException{
//   。。。。。。
}
  
 
  • 1
  • 2

使用throws关键字将异常抛给上一级后,如果不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码。

2.使用throw关键字抛出异常

throw关键字通常用于方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即终止,他后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法的声明中指名要抛出的异常,如果要捕捉throw抛出异常,则必须使用try-catch语句块。
如:

if (number1 < 0 || number2 < 0) { throw new MyException("不可以使用负数"); }
  
 
  • 1
  • 2

若有错误,欢迎指正批评,欢迎批评。
每文一句:生活不能等别人来安排,要自已去争取和奋斗;而不论其结果是喜是悲,但可以慰藉的是,你总不枉在这世界上活了一场。——路遥《平凡的世界》

文章来源: zxfdog.blog.csdn.net,作者:Fdog_,版权归原作者所有,如需转载,请联系作者。

原文链接:zxfdog.blog.csdn.net/article/details/104747293

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200