throws 与 throw
/*
* 有些时候,我们是可以对异常进行处理的,但是又有些时候,我们根本就没有权限去处理某个异常。
* 或者说,我处理不了,我就不处理了。
* 为了解决出错问题,Java针对这种情况,就提供了另一种处理方案:抛出。
*
* 格式:
* throws 异常类名
* 注意:这个格式必须跟在方法的括号后面。
*
* 注意:
* 尽量不要在main方法上抛出异常(因为这样就没有意义了)。
* 但是我讲课为了方便我就这样做了(将来实际开发中是弹出页面)。
*
* 小结:
* 编译期异常的抛出,将来调用者必须处理。
* 运行期异常的抛出,将来调用可以不用处理,也可以处理(像处理编译期异常那样处理)。。
*/
示例代码如下:
1 package cn.itcast_05; 2 3 import java.text.ParseException; 4 import java.text.SimpleDateFormat; 5 import java.util.Date; 6 7 /* 8 * 有些时候,我们是可以对异常进行处理的,但是又有些时候,我们根本就没有权限去处理某个异常。 9 * 或者说,我处理不了,我就不处理了。 10 * 为了解决出错问题,Java针对这种情况,就提供了另一种处理方案:抛出。 11 * 12 * 格式: 13 * throws 异常类名 14 * 注意:这个格式必须跟在方法的括号后面。 15 * 16 * 注意: 17 * 尽量不要在main方法上抛出异常(因为这样就没有意义了)。 18 * 但是我讲课为了方便我就这样做了(将来实际开发中是弹出页面)。 19 * 20 * 小结: 21 * 编译期异常的抛出,将来调用者必须处理。 22 * 运行期异常的抛出,将来调用可以不用处理,也可以处理(像处理编译期异常那样处理)。。 23 */ 24 public class ExceptionDemo { 25 public static void main(String[] args) { 26 System.out.println("今天天气很好"); 27 try { 28 method(); // 调用者也可以继续再把异常抛出给main函数,即把异常抛给虚拟机了,虚拟机会进行异常默认处理,同时将程序停止运行,可是这个方案这不是我想要的! 29 } catch (ParseException e) { 30 e.printStackTrace(); 31 } 32 System.out.println("但是就是不该有雾霾"); 33 34 method2(); // 运行期异常的抛出,将来调用可以不用处理,也可以处理(像处理编译期异常那样处理)。 35 } 36 37 // 运行期异常的抛出(其实运行期异常是不需要抛出的,但是为了演示我依然抛出来,尽管我抛出来了,你调用者可以处理也可以不处理) 38 public static void method2() throws ArithmeticException { 39 int a = 10; 40 int b = 0; 41 System.out.println(a / b); 42 } 43 44 // 编译期异常的抛出 45 // 在方法声明上抛出,是为了告诉调用者,你注意了,调用这个方法时可能会有问题,又因为是编译期异常,所以调用者必须要处理,否则编译通不过。 46 public static void method() throws ParseException { 47 String s = "2014-11-20"; 48 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 49 Date d = sdf.parse(s); // 编译期异常,可以不在方法上进行声明,直接用try...catch对该句进行处理;也可以在方法声明上抛出异常声明,让调用者去用try...catch进行处理。 50 System.out.println(d); 51 } 52 }
程序运行结果为:
今天天气很好 java.text.ParseException: Unparseable date: "2014-11-20" at java.base/java.text.DateFormat.parse(DateFormat.java:388) at cn.itcast_05.ExceptionDemo.method(ExceptionDemo.java:49) at cn.itcast_05.ExceptionDemo.main(ExceptionDemo.java:28) 但是就是不该有雾霾 Exception in thread "main" java.lang.ArithmeticException: / by zero at cn.itcast_05.ExceptionDemo.method2(ExceptionDemo.java:41) at cn.itcast_05.ExceptionDemo.main(ExceptionDemo.java:34)
/*
* throw:如果在功能方法内部出现了异常情况,程序不能继续运行,需要进行跳转时,我们可以把该异常抛出,这个时候的抛出的是该异常的对象。
*
* throws和throw的区别(面试题)
throws
用在方法声明后面,跟的是异常类名,
可以跟多个异常类名,用逗号隔开,
表示抛出异常,由该方法的调用者来处理,
throws表示出现异常的一种可能性,并不一定会发生这个异常。
throw
用在方法体内,跟的是异常对象名,
只能抛出一个异常对象名,
表示抛出异常,由方法体内的语句处理,
throw则是抛出了异常,执行throw则一定抛出了某种异常。
*
*/
示例代码如下:
1 package cn.itcast_06; 2 3 /* 4 * throw:如果在功能方法内部出现了异常情况,程序不能继续运行,需要进行跳转时,我们可以把该异常抛出,这个时候的抛出的是该异常的对象。 5 * 6 throws和throw的区别(面试题) 7 throws 8 用在方法声明后面,跟的是异常类名, 9 可以跟多个异常类名,用逗号隔开, 10 表示抛出异常,由该方法的调用者来处理, 11 throws表示出现异常的一种可能性,并不一定会发生这个异常。 12 throw 13 用在方法体内,跟的是异常对象名, 14 只能抛出一个异常对象名, 15 表示抛出异常,由方法体内的语句处理, 16 throw则是抛出了异常,执行throw则一定抛出了某种异常。 17 * 18 */ 19 public class ExceptionDemo { 20 public static void main(String[] args) { 21 // method(); // 运行期异常,用throw抛出,我们没有做处理,则会使用JVM的异常默认处理机制:即将该异常进行处理,将该异常的名称、异常的信息和异常出现的位置打印在了控制台上,同时将程序停止运行。 22 // 运行期异常的抛出,将来调用可以不用处理,也可以处理(像处理编译期异常那样处理)。 23 try { 24 method2(); // 编译期异常的抛出,将来调用者必须处理(前提是这个异常要在方法上声明抛出给调用者,如果你直接在方法里就处理,那跟调用者就没有关系了)。 25 } catch (Exception e) { 26 e.printStackTrace(); 27 } 28 29 System.out.println("over"); 30 } 31 32 // throw是在方法功能内部抛出异常的对象,若是运行期异常,一般不用在方法上进行声明(也可以声明哦,但不管你声不声明,作为调用者可以处理也可以不处理) 33 public static void method() { 34 int a = 10; 35 int b = 0; 36 if (b == 0) { 37 throw new ArithmeticException(); // 运行期异常,使用JVM的一个默认的异常处理机制:即将该异常进行处理,将该异常的名称、异常的信息和异常出现的位置打印在了控制台上,同时将程序停止运行。 38 } else { 39 System.out.println(a / b); 40 } 41 } 42 43 // throw是在方法功能内部抛出异常的对象,若是编译期异常,一般在方法上进行声明,交给调用者处理 44 public static void method2() throws Exception { 45 int a = 10; 46 int b = 0; 47 if (b == 0) { 48 throw new Exception(); // 编译期异常,这是一条正常的语句,而该正常的语句出现了编译期异常,必须要处理否则编译就不通过。 49 } else { // 可以不在方法上进行声明,直接用try...catch对该句进行处理;也可以在方法声明上抛出异常声明,让调用者去用try...catch进行处理。 50 System.out.println(a / b); 51 } 52 } 53 }
程序运行结果为:
java.lang.Exception at cn.itcast_06.ExceptionDemo.method2(ExceptionDemo.java:48) at cn.itcast_06.ExceptionDemo.main(ExceptionDemo.java:24) over
我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
SAP Fiori里的List是如何做到懒加载Lazy load的
今天一同事问我这个问题:S/4HANA Fiori应用里的列表,一旦Scroll到底部就会自动向后台发起新的请求把更多的数据读取到前台显示。 以Product Master这个应用为例,我点击搜索之后,结果区域显示当前系统一共有140个product,但是只有前25个返回并显示在浏览器里。 这个分页效果是UI5 OData的参数实现的:$skip=0&top=25。 而总数140,是通过参数$inlinecount实现,其原理和ABAP Open SQL的SELECT COUNT(*)类似。 从Chrome开发者工具能观察到头25个product的payload: 当将列表滚动至底部时,第二批共25个product从后台读取出来,显示在前台: 这个http请求的参数:$skip=25&top=25,用于读取从第25个到第50个product。 从调用栈能清楚发现是scroll这个事件触发的第二批product的读取动作。 然后再去GrowingEnablement.requestNewPage这一个调用栈,发现一个属性_iLimit维护了一个开始索引,每次scroll到...
- 下一篇
finally关键字的特点及其面试题
finally关键字的特点及其面试题 A:finally用于释放资源,它的代码永远会执行。 特殊情况:如果在执行到finally之前jvm退出了,比如System.exit(0),则就不能执行了finally控制的语句体了。 B:面试题 a:final,finally,finalize的区别? final:最终的意思,可以修饰类、成员变量、成员方法 修饰类,类不能被继承。 修饰变量,变量是常量。 修饰方法,方法不能被重写。 finally:是异常处理的一部分,用于释放资源。 一般来说,代码肯定会执行,特殊情况:如果在执行到finally之前jvm退出了,比如System.exit(0),则就不能执行了finally控制的语句体了。 finalize:是Object类的一个方法,用于垃圾回收。 b:如果catch里面有return语句,请问finally里面的代码还会执行吗? 如果会,请问是在return前,还是return后。 会。前。(相对于最后一个能执行到的return语句来说) 准确的说,应该是在中间。 C:try...catch...finally...的格式变形 a:try....
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Hadoop3单机部署,实现最简伪集群