异常处理:try-catch-finally与throws的区别及使用情况
Error与Exception
Error:Java 虚拟机无法解决的严重问题。如: JVM系统内部错误、资源耗尽等严重情况。Error类对象由 Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
比如: StackOverflowError 和OOM(Out of memory Error)。一 般不编写针对性的代码进行处理。
eg:栈溢出、堆溢出、虚拟机运行错误等。
//Exception in thread "main" java.lang.StackOverflowError//1.栈溢出
// main(args);//2.堆溢出:java.lang.OutOfMemoryError
// Integer[] arr = new Integer[1024*1024*1024];//1024*1024*1024个4字节
Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。
例如:
空指针访问
试图读取不存在的文件
网络连接中断
数组角标越界等
1.异常的体系结构
java.lang.Throwable;* |---java.lang.Error;* |---java.lang.Exception;:可以进行异常的处理* |---编译时异常(checked)* |---IOException* |---FileNotFoundException* |---ClassNotFoundException* |---运行时异常(unchecked)* |---NullPointerException* |---ArrayIndexOutOfBoundsException* |---ClassCastException* |---NumberFormatException* |---InputMismatchException* |---ArithmeticException // 算数异常
蓝色:非受检异常(unchecked)
红色:受检异常(checked)
2.从程序执行过程来看,分为:编译时异常和运行时异常
3.异常处理:抓抛模型
过程一:== “抛”==:程序在正常执行过程中,一旦出现异常,就会在异常代码处生成一个对应异常的对象并将此对象抛出。
一旦抛出对象以后,其后的代码就不再执行。
/*关于异常对象的产生:①系统自动生成的异常对象②手动的生成一个异常对象,并抛出throw*/
过程二:“抓”:异常的处理方式:① try-catch-finally ② throws
4.异常处理方式一:
- try-catch-finally 的使用
try{//可能会出现异常的代码
}catch(异常类型1 变量名1){//处理异常的方式1
}catch(异常类型2 变量名2){//处理异常的方式2
}...
finally{//一定会执行的代码
}
eg:
String str = "123";str = "abc";//外面声明int num = 0;try {// int num = Integer.parseInt(str);//里面使用num = Integer.parseInt(str);System.out.println("-----1");} catch (NumberFormatException e) {// System.out.println("出现数制转换异常");//String getMessage():System.out.println(e.getMessage());//printStackATrace():e.printStackTrace();} catch (NullPointerException e) {System.out.println("出现空指针异常");} catch (Exception e) {System.out.println("Exception父类放后面");}System.out.println(num);//try结构里的不能调用System.out.println("-----2");
说明:
1).finally是可选的;
2).使用try将可能会出现异常的代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常的对象,根据此对象的类型,去catch中进行匹配;
3).一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常的处理,一旦处理完成,就跳出当前的try-catch结构(在没有写finally的情况下),继续执行后面的代码;
4).catch中的异常类型如果没有子父类关系,谁先声明无所谓; catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类上面;否则,报错;
5).常用的异常对象处理的方式:①String getMessage(): ②printStackATrace():
6).在try结构中声明的变量,出了try结构之后,就不能被调用;可以在try外面先声明,在try内部使用
7).try-catch-finally结构可以嵌套
注:①使用try-catch-finally处理编译时异常,使得编译时不再报错,但运行时可能会出错,相当于将一个编译时可能出现的异常,延迟到运行时出现。
②开发中,由于运行时异常比较常见,所以我们通常不针对运行时异常编写try-catch-finally,针对编译时异常,一定要考虑异常处理。
5.异常处理方式二:
- throws + 异常类型
1).“throws + 异常类型”写在方法的声明处,致命此方法执行时,可能会抛出异常类型,一旦当方法体执行时出现异常,仍会在异常代码出生成一个异常的对象,此对象满足throws后的异常类型时,就会被抛出。异常代码后续的代码,就不再执行;
2).try-catch-finally:真正的将异常给处理掉了。
而throws方式只是将异常抛给了方法的调用者,并没有真正将异常处理掉。
3).开发中如何选择使用try-catch-finally还是使用throws?
a. 父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能够使用throws,意味着如果子类重写方法中有异常,必须使用try-catch-finally方式处理;
b. 执行额方法中,先后又调用了另外的几个方法,这几个方法是递进关系的,我们建议这几个方法使用throws的方式进行处理。而执行的方法a可以考虑try-catch-finally方式进行处理。
eg:
//main()中使用try-catch-finally结构,不然继续throws给JVM,套死了public static void main(String[] args) {ExceptionTest2 test = new ExceptionTest2();try {test.method1();} catch (IOException e) {e.printStackTrace();}}
public static void method1() throws FileNotFoundException, IOException{File file = new File("hello.txt");FileInputStream fis = new FileInputStream(file);int data = fis.read();while (data != -1) {System.out.println((char) data);//Unhandled exception: java.io.IOExceptiondata = fis.read();}fis.close();}
tips:方法重写的规则之一:子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型.
eg:
class SuperClass{public void method() throws IOException {}
}
class SubCLass extends SuperClass{public void method() throws FileNotFoundException {}
}
而要是在其他方法里调用method(),也必须处理异常,此时在main()之前/main()中直接try-catch-finally结构处理异常。
eg:
public void display(SuperClass s){try{s.method();}catch(IOException e){e.printStackTrace();}}public static void main(String[] args) {OverrideTest test = new OverrideTest();test.display(new SubCLass());}
异常处理:try-catch-finally与throws的区别及使用情况相关推荐
- Java 异常处理 try catch finally throws throw 的使用和解读(一)
最近的一个内部表决系统开发过程中, 发现对异常处理还存在一些模棱两可的地方, 所以想着整理一下 主要涉及到: 1.try catch finally throws throw 的使用和解读 2.自定义 ...
- java throw与throws_基于Java中throw和throws的区别(详解)
系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...
- throws java_基于Java中throw和throws的区别(详解)
系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...
- throw 和 throws 的区别
我们在运行一段代码,做一个项目的时候遇到BUG.异常是再正常不过的事情.说到异常,异常种类是有很多种的,Throwable就是异常的根类. 常见的异常就有在Throwable下的子类 错误 - Err ...
- throw 和 throws 的区别?
throw 和 throws 的区别? throw: 表示方法内抛出某种异常对象 如果异常对象是非 RuntimeException 则需要在方法申明时加上该异常的抛出 即需要加上 throws 语句 ...
- 窥探try ... catch与__try ... __except的区别
VC中的这两个东西肯定谁都用过, 不过它们之间有什么区别, 正好有时间研究了一下, 如果有错误欢迎拍砖. 基于VC2005, 32位XP 平台测试通过. 估计对于其他版本的VC和操作系统是不通用的. ...
- C#异常处理try catch
原文地址:点击打开链接 本文翻译自CodeProject上的一篇文章,原文地址. 目录 介绍 做最坏的打算提前检查不要信任外部数据可信任的设备:摄像头.鼠标以及键盘"写操作"同样可 ...
- throw和throws的区别
throw和throws的区别: throw代表动作,表示抛出一个异常的动作:throws代表一种状态,代表方法可能有异常抛出:throw用在方法实现中,而throws用在方法声明中:throw只能用 ...
- java里throws详细讲解,基于Java中throw和throws的区别(详解)
系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...
最新文章
- 100% .NET Control_使用CurrencyManager 创建一个导航条来控制DatagGrid的XNavBar控件(VB.NET)....
- 【Bootloader】探究bootloader,分析u-boot源码
- C++ WinForm Application Designer issue
- ssm提交post_我用spring mvc做,用post方式提交,后台获取不到参数值,用get方式就可以,什么问题...
- 薪资/薪水/金额的数据类型
- angular4更改表单中显示的值_关于angular4中FormBuilder重新赋值时发生的问题
- 干货!一文带您读懂区块链溯源!
- IE设置自动获得代理(ISA20042006中设置相应项)
- Win11系统安装 WSA
- 谷歌 TensorFlow Roadshow 北京站
- Cosy V3.1.3 简洁大气WordPress博客主题自适应个人自媒体网站模板(含积木部分插件)
- Fix ‘Clearing orphaned inodes’ on Ubuntu
- ORACLE-SQL笔记
- MATLAB 如何让图形变美?[第一期]
- 递推与递归 (区别)
- The day that you see me old-当我日渐老去的时候
- fedora dnf_如何使用DNF升级Fedora Linux系统
- 给Lulu的书签,链接及其他
- golang im实战入门
- 一个快速开发APP的框架:AndroidQuick
热门文章
- LeetCode:226. 翻转二叉树
- (王道408考研操作系统)第五章输入/输出(I/O)管理-第一节3:I/O控制方式
- 基础编程题之最大连续bit数(位运算)
- DNS常用记录类型和服务发现(DNS解析)
- Linux的chattr与lsattr命令详解(重点-i参数,锁定文件,禁止修改文件)
- Makefile 打印变量的值
- matlab实现非线性规划
- MariaDB:删除数据库报错:error: 'Error dropping database (can't rmdir './shiro', errno: 39)'
- [C语言 - 10] C语言保留字
- Tomcat的目录结构详解