throw跟throws关键字
throws关键字
定义一个方法的时候可以使用throws关键字声明。使用throws关键字声明的方法表示此方法不处理异常,而交给方法调用处进行处理。
throws关键字格式:
public 返回值类型 方法名称(参数列表,,,)throws 异常类{};
假设定义一个除法,对于除法操作可能出现异常,可能不会。所以对于这种方法最好将它使用throws关键字声明,一旦出现异常,
则应该交给调用处处理。
- class Math{
- public int div(int i,int j) throws Exception{ // 定义除法操作,如果有异常,则交给被调用处处理
- int temp = i / j ; // 计算,但是此处有可能出现异常
- return temp ;
- }
- };
- public class ThrowsDemo01{
- public static void main(String args[]){
- Math m = new Math() ; // 实例化Math类对象
- try{
- System.out.println("除法操作:" + m.div(10,2)) ;
- }catch(Exception e){
- e.printStackTrace() ; // 打印异常
- }
- }
- };
因为div使用了throws关键字声明,所以调用此方法的时候,方法必须进行异常处理。通过try...catch;
如果在主方法的声明也使用了throws关键字呢,那么是不是意味着主方法也可以不处理异常。
- class Math{
- public int div(int i,int j) throws Exception{ // 定义除法操作,如果有异常,则交给被调用处处理
- int temp = i / j ; // 计算,但是此处有可能出现异常
- return temp ;
- }
- };
- public class ThrowsDemo02{
- // 在主方法中的所有异常都可以不使用try...catch进行处理
- public static void main(String args[]) throws Exception{
- Math m = new Math() ; // 实例化Math类对象
- System.out.println("除法操作:" + m.div(10,0)) ;
- }
- };
运行结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at methoud.Math.div(ThisDemo06.java:4)
at methoud.ThisDemo06.main(ThisDemo06.java:12)
在本程序中,主方法不处理任何异常,而交给JAVA中最大头JVM,所以如果在主方法使用了throws关键字,则表示一切异常
交给JVM进行处理。默认处理方式也是JVM完成。
throw关键字
throw关机字作用是抛出一个异常,抛出的时候是抛出的是一个异常类的实例化对象,
在异常处理中,try语句要捕获的是一个异常对象,那么此异常对象也可以自己抛出。
- package methoud;
- public class ThisDemo06{
- public static void main(String args[]){
- try{
- throw new Exception("自己抛着玩的。") ; // 抛出异常的实例化对象
- }catch(Exception e){
- System.out.println(e) ;
- }
- }
- };
范例,throw与throws的应用
在一般开发中,try,,catch,,finally,throw,throws联合使用的情况是最多的。
例如,现在要使用一个相除的方法,但是在操作之前必须打印“运算开始”的信息,结束之后必须打印“异常结束”。
如果有异常,需要把异常交给异常调用处处理。面对这样要求,必须全部使用以上关键字。
- class Math{
- public int div(int i,int j) throws Exception{ // 定义除法操作,如果有异常,则交给被调用处处理
- System.out.println("***** 计算开始 *****") ;
- int temp = i / j ; // 计算,但是此处有可能出现异常
- System.out.println("***** 计算结束 *****") ;
- return temp ;
- }
- };
- public class ThrowDemo02{
- public static void main(String args[]){
- Math m = new Math() ;
- try{
- System.out.println("除法操作:" + m.div(10,0)) ;
- }catch(Exception e){
- System.out.println("异常产生:" + e) ;
- }
- }
- };
运行结果:
***** 计算开始 *****
异常产生:java.lang.ArithmeticException: / by zero
以上没有计算结束,因为没有异常发生了,直接中断程序操作。所以做以下操作。
- package methoud;
- class Math{
- public int div(int i,int j) throws Exception{ // 定义除法操作,如果有异常,则交给被调用处处理
- System.out.println("***** 计算开始 *****") ;
- int temp = 0 ; // 定义局部变量
- try{
- temp = i / j ; // 计算,但是此处有可能出现异常
- }catch(Exception e){
- }
- System.out.println("***** 计算结束 *****") ;
- return temp ;
- }
- };
- public class ThisDemo06{
- public static void main(String args[]){
- Math m = new Math() ;
- try{
- System.out.println("除法操作:" + m.div(10,0)) ;
- }catch(Exception e){
- System.out.println("异常产生:" + e) ;
- }
- }
- };
运行结果:
***** 计算开始 *****
***** 计算结束 *****
异常产生:java.lang.ArithmeticException: / by zero
这里虽然貌似成功了,但是,这里的异常并没有抛出去,因为在方法中已经被自动处理了,没有抛出去。
所以要抛出异常对象,给方法调用处处理,使用throw关键字。
- package methoud;
- class Math{
- public int div(int i,int j) throws Exception{ // 定义除法操作,如果有异常,则交给被调用处处理
- System.out.println("***** 计算开始 *****") ;
- int temp = 0 ; // 定义局部变量
- try{
- temp = i / j ; // 计算,但是此处有可能出现异常
- }catch(Exception e){
- throw e ; //抛出异常。
- }finally{ // 不管是否有异常,都要执行统一出口
- System.out.println("***** 计算结束 *****") ;
- }
- return temp ;
- }
- };
- public class ThisDemo06{
- public static void main(String args[]){
- Math m = new Math() ;
- try{
- System.out.println("除法操作:" + m.div(10,0)) ;
- }catch(Exception e){
- System.out.println("异常产生:" + e) ;
- }
- }
- };
Exception与runtimeException区别
是面试中经常出现的问题。
观察以下代码:
- package methoud;
- public class ThisDemo06{
- public static void main(String args[]){
- String str = "123" ; // 定义字符串,全部由数字组成
- int temp = Integer.parseInt(str) ; // 将字符串变为int类型
- System.out.println(temp * temp) ; // 计算乘方
- }
- };
- parseInt()的定义格式:
- public static int parseInt(String s) throws NumberFormatException
此方法明明使用了throws关键字抛出异常,为什么不用处理,也可以编译通过?
在JAVA异常处理机制中,
1)如果抛出的是EXception的类型,则必须进行try ..catch进行处理。
2)如果抛出的是RuntimeException的类型,则可以不使用try。。catch处理,一旦发生异常之后,将由JVM处理。
为了保证程序的健康性,在有可能出现异常的时候还是老实使用try ..catch处理。
自定义异常类。
只需要继承Exception类就可以自定义异常类。因为JAVA中提供的都是标准异常类(包括一些异常信息),如果需要自己想要
的异常信息就可以自定义异常类。
- class MyException extends Exception{ // 自定义异常类,继承Exception类
- public MyException(String msg){
- super(msg) ; // 调用Exception类中有一个参数的构造方法,传递错误信息
- }
- };
- public class DefaultException{
- public static void main(String args[]){
- try{
- throw new MyException("自定义异常。") ; // 抛出异常
- }catch(Exception e){
- System.out.println(e) ; //打印错误信息
- }
- }
- }
运行结果:
methoud.MyException: 自定义异常。
总结
throw与throws关键字联合使用问题。
1)throw:抛出异常。
2)throws:在方法声明处使用,表示此方法不处理异常,而在调用此方法处处理异常。
Exception是必须处理的,而RuntimeException异常是可以不处理的。但是为了保证程序正常运行,最好处理。
如果自定义异常,直接继承异常即可。
throw跟throws关键字的更多相关文章
- AJPFX关于throw、throws关键字的解析
throw.throws关键字 throw关键字: 是用于方法体内部,用来抛出一个Throwable类型的异常.如果抛出了检查异常, 则还应该在方法头部声明方法可能抛出的异常类型.该方法的调用者也必须 ...
- Java基础系列--throw、throws关键字
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8484697.html 一.概述 throw和throws就是异常相关的关键字,在java中 ...
- java基础16 捕获、抛出以、自定义异常和 finally 块(以及关键字:throw 、throws)
1.异常的体系 /* ------|Throwable:所有异常和错误的超类 ----------|Error(错误):错误一般用于jvm或者硬件引发的问题,所以我们一般不会通过代码去处理错误的 -- ...
- Java中异常关键字throw和throws使用方式的理解
Java中应用程序在非正常的情况下停止运行主要包含两种方式: Error 和 Exception ,像我们熟知的 OutOfMemoryError 和 IndexOutOfBoundsExceptio ...
- java异常——五个关键字(try、catch、finally、throw、throws)
一.try.catch.finally常用组合 try{ xxx }catch(xxxException e){ e.printStackTrace(); } try{ xxx }catch(xxxE ...
- Java中关键字throw和throws的区别
==========================================题外话===================================================== 今 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- java中的throw与throws的区别
什么时运行时异常?什么是非运行时异常? 通俗的讲: 运行时异常:就是编译通过,运行时就崩了,比如数组越界. 非运行时异常:就是编译不通过,这时就得必须去处理了.不然就没法运行了. 全面的讲: Thro ...
- Java中处理异常throw和throws
1.首先我们来了解什么是异常呢? 异常阻止当前方法或作用域继续执行的问题. 2.处理异常 说到处理异常,我们当然会想到 try catch finally 在java中我们会对异常的处理有更高的认识 ...
随机推荐
- jQuery知识大杂汇
1.jQuery 语法是通过选取 HTML 元素,并对选取的元素执行某些操作. 基础语法: $(selector).action() 举几枚栗子吧: $(this).hide() - 隐藏当前元素 $ ...
- 使用Python给要素添加序号
在ArcGIS的属性表中,由于编辑修改的原因,默认的FID或OID并不连续,经常需要给要素添加连读的序号,可使用Python代码完成. rec=-1 def autoIncrement(): glob ...
- SAP ST05数据跟踪使用
有时我们想知道SAP操作,对数据库中的那些表进行的增删查改. 可以使用ST05跟踪SQL语句. ST05功能界面如下: 1---激活跟踪 2---结束跟踪 3---显示跟踪结果. 如果想跟踪SQL语句 ...
- “Stamping” PDF Files Downloaded from SharePoint 2010
http://blog.falchionconsulting.com/index.php/2012/03/stamping-pdf-files-downloaded-from-sharepoint-2 ...
- 使用tinypng优化Android的资源图片
tinypng 是一个支持压缩png和jpg图片格式的网站,通过其独特的算法(通过一种叫“量化”的技术,把原本png文件的24位真彩色压缩为8位的索引演示,是一 种矢量压缩方法,把颜色值用数值123等 ...
- Android 在外部存储读写文件
本文主要介绍android中如何在外部存储读写数据 sd卡的路径 sdcard:2.3之前的sd卡路径 mnt/sdcard:4.3之前的sd卡路径 storage/sdcard:4.3之后的sd卡路 ...
- iOS之 Mac下抓包工具使用wireshark
主要是mac上面网卡的授权 分三个步骤: 1.wireshark安装 wireshark运行需要mac上安装X11,mac 10.8的系统上默认是没有X11的.先去http://x ...
- MySQL学习基础 之 起航篇
MySQL 学习来自慕课网<与MySQL的零距离接触> MySQL是一个开源的关系型数据库管理系统 MySQL分为社区版和企业版 MySQL登录和退出相关的命令 参数 描述 -D,--da ...
- 快速与MySQL交互,使用XMAPP打开MySQL数据库,并用shell进行与MySQL交互<Window 10>
1.如果想要通过XAMPP shell登录MySQL,还需要下载安装好XAMPP. 2.双击打开xampp-control.exe,会出现以下界面,点击开启Apache和MySQL,这样我们就开启服务 ...
- Swift中的字典
学习来自<极客学院:Swift中的字典> 工具:Xcode6.4 直接上基础的示例代码,多敲多体会就会有收获:百看不如一敲,一敲就会 import Foundation //字典的声明 v ...