JavaSE 异常处理
发布日期:2022-02-14 16:09:29
浏览次数:29
分类:技术文章
本文共 5024 字,大约阅读时间需要 16 分钟。
Java 异常
异常情形:
- 概念:指程序在运行过程中阻止当前方法或作用域继续执行的问题(意外的情况);
- 异常与错误
- 错误:很难处理(如内存溢出);不能通过异常处理来解决,错误无法控制,程序肯定中断
- 异常:程序中发生不正常事件流,通过处理程序依然可以运行下去。
异常的体系:
- Throwable:是Java语言中所有错误或异常的超类。有两个子类:Error和Exception。
- Error(错误):用与指示合理的应用程序不应该试图捕获的严重问题
- Exception(异常):所有异常类的父类,是可以捕获并处理的;异常分为运行期异常与非运行期异常(通常称为编译期异常)。
异常(Exception):
运行期异常(RuntimeException):程序运行时抛出的异常,其子类都是运行期异常。
- ArithmeticException 数学异常
- NullPointerException 空指针异常
- IndexOutOfBandsException 下标越界
- ClassCastException 类型强制转换异常
- IllegalArgumentException 参数异常
public class ExcptionTest { public void test(){ System.out.println("====运行前===="); int a=10/0; System.out.println("====运行后===="); } public static void main(String[] args) { ExcptionTest et= new ExcptionTest(); et.test(); }}
检测异常(CheckedException不存在此类):非运行期的异常
- IOException
- SQLException
RuntimeException与CheckedException
- RuntimeException不会引起编译报错,不需要强制处理;
- CheckedException会引起编译报错,需要强制处理(需抛出才能捕获),不捕获将不能编译;
public class RuntimeExceptionDemo { public static void main(String[] args) /*抛出异常throws IOException*/ { //运行时异常,不会引起编译错误,不需要强制处理 try{ String a = null; System.out.println(a.length()); }catch(NullPointerException e){ e.printStackTrace(); } //checkedException异常,会引起编译异常,需要强制处理 try { throw new IOException(); } catch (Exception e) { e.printStackTrace(); } }}
try、catch、finally的使用:
- try:检测不安全代码块(发现异常。一个try块中可以存在多个异常,但检测到异常就会结束try块);
- catch:异常处理代码(没有catch异常时,JVM会捕获异常终止运行);
- finally:不管出现或不出现异常都会执行的代码;
- 其中catch块和finally块可省略,但try块不能;
- 可以有多个catch块;
- 捕获异常,父类异常的catch块在子类catch块之后;
- 可以catch任何异常
- catch CheckedException异常时,try块需抛出异常(最后一行抛出);
catch和finally中有编译期异常需try catch处理 或throws方法抛出异常;
public class TryCatchFinally { public static void main(String[] args) { try { String str = null; str.length(); int i = 10/0; System.out.println("这是try"); //CheckedXception需要抛出才能catch throw new IOException(); System.out.println("这是catch"); } //当多个 catch捕捉 Exception异常时需要注意父类在子类后catch catch(NullPointerException e){ System.out.println("这是catch"); try { throw new SQLException(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }catch(Exception e){ System.out.println("这是catch"); } finally { System.out.println("这是finally"); } }}
finally与return:
return不能阻止finally的执行(先finally在return),异常也不能阻止finally的执行,System.exit(0)会终止finally;
public class Test { public static void main(String[] args) { try{ System.out.println("try 阻止世界的运作"); //System.exit(0); System.out.println(10/0); //return ; }catch(Exception e){ System.out.println("catch 异常"); return ; } //finally不受return和异常影响 finally{ //占时知道System.exit();能结束 System.out.println("你不能阻止世界的运作"); } System.out.println("你很吊啊return"); } }
throw、throws与层层抛出异常:
- throw可以主动抛出异常(注意异常强制处理问题);
- 方法标签throws抛出异常,调用抛出异常方法需强制处理异常或继续往上抛,可以抛出多个异常用逗号隔开;
层层抛出异常:catch中,再次用throw抛出异常;
public class ThrowAndThrows { public static void main(String[] args) { try{ testThrows(); }catch(IOException e){ e.getStackTrace(); }catch(NullPointerException e){ e.printStackTrace(); } } //throws抛出多个异常 public static void testThrows() throws IOException,NullPointerException{ throwsShow(); } public static void throwsShow() throws IOException{ throw new IOException("编译异常"); } public static void throwShow(){ try{ throw new IOException(); }catch(IOException e){ e.getStackTrace(); } }}
自定义异常:
- 自定义类继承Exception类;
- 添加构造方法用super调父类对应构造器;
- 在某个方法抛出该异常;
捕获该异常;
public class CustomException extends Exception{ //自定义异常类继承Exception类,只有构造方法 public CustomException(){} //创建构造器,用super调用父类对应构造器 public CustomException(String message) { super(message); }}public class Test { public static void main(String[] args) { //捕获自定义异常 try { showMyException(); } catch (CustomException e) { e.printStackTrace(); } } public static void showMyException() throws CustomException{ throw new CustomException("自定义异常"); }}
结果:
com.chinasofti.se.exception.CustomException.CustomException: 自定义异常at com.chinasofti.se.exception.CustomException.Test.showMyException(Test.java:18)at com.chinasofti.se.exception.CustomException.Test.main(Test.java:9)
异常的使用误区
- 尽可能减小try块;
- 保证所有资源都被正确释放,正确运用finally关键字;
- catch语句应当尽量指定具体的异常类型,而不应该指定涵盖范围太广的Exception类;不要一个Exception试图处理所有可能出现的异常;
- 既然捕获了异常,就要对它进行适当的处理。不要捕获异常之后不予理睬(丢弃);
- 在异常处理模块中提供适量的错误原因信息,组织错误信息使其易于理解和阅读;
- 不要在finally块中处理返回值;
- 不要在构造函数抛出异常。
转载地址:https://blog.csdn.net/qq_29593573/article/details/72902823 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月17日 18时56分30秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
BeautifulSoup库的安装及基本元素
2019-04-26
基于bs4的HTML内容遍历方法
2019-04-26
信息标记与信息提取
2019-04-26
各大网站CSS初始化代码
2019-04-26
正则表达式的基本用法
2019-04-26
Python的Re库(正则表达式)基本用法
2019-04-26
Scrapy爬虫框架
2019-04-26
Anaconda
2019-04-26
NumPy库入门
2019-04-26
简单的留言板网页
2019-04-26
如何快速的搭建Apache+MySQL+PHP+PERL的环境
2019-04-26
初识JavaScript
2019-04-26
JavaScript的常用互动方法
2019-04-26
JavaScript的DOM操作
2019-04-26
JavaScript实现的网页计算器功能
2019-04-26
英语四六级考试忘记准考证?怎么办?
2019-04-26
JavaScript内置对象
2019-04-26
DOM对象,控制HTML对象
2019-04-26
制作一个表格,显示班级的学生信息
2019-04-26