当前位置: 首页 > 编程日记 > 正文

java initcause_Java 异常

问:java 异常有哪几种,特点是什么?

答:异常是发生在程序执行过程中阻碍程序正常执行的错误操作,只要在 Java 语句执行中产生异常,则一个异常对象就会被创建。

Throwable 是所有异常的父类,它有两个直接子类 Error 和 Exception,其中 Exception 又被继续划分为被检查的异常(checked exception)和运行时的异常(runtime exception,即不受检查的异常)。

Error 表示系统错误,通常不能预期和恢复(譬如 JVM 崩溃、内存不足等);

被检查的异常(Checked exception)在程序中能预期且要尝试修复(如我们必须捕获 FileNotFoundException 异常并为用户提供有用信息和合适日志来进行调试,Exception 是所有被检查的异常的父类);

运行时异常(Runtime Exception)又称为不受检查异常,譬如我们检索数组元素之前必须确认数组的长度,否则就可能会抛出ArrayIndexOutOfBoundException 运行时异常,RuntimeException 是所有运行时异常的父类。

问:java 中 throw 与 throws 的区别是什么?

答:throw 使用的位置在方法中,后面跟的异常对象实例,表示抛出异常,由方法体内语句处理,如果方法中有 throw 抛出 RuntimeException 及其子类,则声明上可以没有 throws;如果方法中有 throw 抛出 Exception 及其子类,则声明上必须有 throws。

public static void main(String[] args) {

String s = "abc";

if(s.equals("abc")) {

throw new NumberFormatException();

} else {

System.out.println(s);

}

}

throws 使用的位置在方法参数小括号后面,后面跟的是一个或者多个异常类名且用逗号隔开,表示抛出异常并交给调用者去处理,如果后面根据的是 RuntimeException 及其子类则该方法可以不用处理,如果后面根据的是 Exception 及其子类则必须要编写代码进行处理或者调用的时候抛出。

public class testThrows(){

public static void function() throws NumberFormatException{

String s = "abc";

System.out.println(Double.parseDouble(s));

}

public static void main(String[] args) {

try {

function();

} catch (NumberFormatException e) {

System.err.println("非数据类型不能强制类型转换。");

}

}

问:java 中被检查的异常和不受检查的异常有什么区别?

答:

被检查的异常应该用 try - catch 块代码处理或用 throws 关键字抛出;

不受检查的异常在程序中不要求被处理或用 throws 抛出;

Exception 是所有被检查异常的基类,而 RuntimeException(是 Exception 的子类) 是所有不受检查异常的基类;被检查的异常适用于那些不是因程序引起的错误情况(如 FileNotFoundException),而不被检查的异常通常都是由于糟糕的编程引起(如 NullPointerException)。

问:java 中 Error 和 Exception 有什么区别?

答:

Error 表示系统级的错误,是 java 运行环境内部错误或者硬件问题,不能指望程序来处理这样的问题,除了退出运行外别无选择,它是 java 虚拟机抛出的。

Exception 表示程序需要捕捉、需要处理的异常,是由与程序设计的不完善而出现的问题,程序可以处理的问题。

问:java 中什么是异常链?

答:异常链是指在进行一个异常处理时抛出了另外一个异常,由此产生了一个异常链条,大多用于将受检查异常(checked exception)封装成为非受检查异常(unchecked exception)或者 RuntimeException。

特别注意如果你因为一个异常而决定抛出另一个新的异常时一定要包含原有的异常,这样处理程序才可以通过 getCause() 和 initCause() 方法来访问异常最终的根源。

问:java 中如何编写自定义异常?

答:可以通过继承 Exception 类或其任何子类来实现自己的自定义异常类,自定义异常类可以有自己的变量和方法来传递错误代码或其它异常相关信息来处理异常。下面是一个自定义异常的常见模板:

public class DemoException extends IOException {

private static final long serialVersionUID = 123456789L;

private String errorCode = "DemoException";

public DemoException(String msg, String errorCode) {

super(msg);

this.errorCode = errorCode;

}

public String getErrorCode() {

return this.errorCode;

}

}

问:请简单描述下面方法的执行流程和最终返回值是多少?

public static int test1() {

int ret = 0;

try {

return ret;

} finally {

ret = 2;

}

}

public static int test2() {

int ret = 0;

try {

int a = 5 / 0;

return ret;

} finally {

return 2;

}

}

public static void test3() {

try {

int a = 5 / 0;

} finally {

throw new RuntimeException("hello");

}

}

答:本题旨在考察 try-catch-finally(可以只有 try 和 finally) 块的用法踩坑经验,具体解析如下。

test1 方法运行返回 0,因为执行到 try 的 return ret; 语句前会先将返回值 ret 保存在一个临时变量中,然后才执行 finally 语句,最后 try 再返回那个临时变量,finally 中对 ret 的修改不会被返回。

test2 方法运行返回 2,因为 5/0 会触发 ArithmeticException 异常,但是 finally 中有 return 语句,finally 中 return 不仅会覆盖 try 和 catch 内的返回值且还会掩盖 try 和 catch 内的异常,就像异常没有发生一样(特别注意,当 finally 中没有 return 时该方法运行会抛出 ArithmeticException 异常),所以这个方法就会返回 2,而且不再向上传递异常了。

test3 方法运行抛出 hello 异常,因为如果 finally 中抛出了异常,则原异常就会被掩盖。

因此为避免代码逻辑混淆,我们应该避免在 finally 中使用 return 语句或者抛出异常,如果调用的其他代码可能抛出异常,则应该捕获异常并进行处理。

问:如果执行 finally 代码块之前方法返回了结果或者 JVM 退出了,这时 finally 块中的代码还会执行吗?

答:只有在 try 里面通过 System.exit(0) 来退出 JVM 的情况下 finally 块中的代码才不会执行,其他 return 等情况都会调用,所以在不终止 JVM 的情况下 finally 中的代码一定会执行。

问:分别说说下面代码片段都有什么问题?

public static void func() throws RuntimeException, NullPointerException {

throw new RuntimeException("func exception");

}

public static void main(String args[]) {

try {

func();

} catch (Exception ex) {

ex.printStackTrace();

} catch (RuntimeException re) {

re.printStackTrace();

}

}

上面代码段对于 func 方法后面 throws 列出的异常类型是不分先后顺序的,所以 func 方法是没问题的;对于 main 方法中在捕获 RuntimeException 类型变量 re 的地方会编译错误,因为 Exception 是 RuntimeException 的超类,func 方法执行的异常都会被第一个 catch 块捕获,所以会报编译时错误。

public class Base {

public void func() throws IOException {

throw new IOException("Base IOException");

}

}

public class Sub extends Base {

public void func() throws Exception {

throw new Exception("Sub Exception");

}

}

如上代码片段在编译时子类 func 方法会出现编译异常,因为在 java 中重写方法抛出的异常不能是原方法抛出异常的父类,这里 func 方法在父类中抛出了 IOException,所有在子类中的 func 方法只能抛出 IOExcepition 或是其子类,但不能是其父类。

public static void func() {

}

public static void main(String args[]) {

try {

func();

} catch (IOException e) {

e.printStackTrace();

}

}

上面代码段编译时在 IOException 时会出现编译错误,因为 IOException 是受检查异常,而 func 方法并没有抛出 IOException,所以编译报错,但是如果将 IOException 改为 Exception(或者 NullPointerException 等)则编译报错将消失,因为 Exception 可以用来捕捉所有运行时异常,这样就不需要声明抛出语句。

答:通过上面几个代码片段可以看出我们在书写多 catch 块时要保证异常类型的优先级书写顺序,要保证子类靠前父类靠后的原则;此外在 java 中重写方法抛出的异常不能是原方法抛出异常的父类;如果方法没有抛出受检查类型异常则在调用方法的地方就不能主动添加受检查类型异常捕获,但是可以添加运行时异常或者 Exception 捕获。

问:关于 java 中的异常处理你有什么心得或者经验?

答:这其实是一个经验题,答案不局限的,可以自由发挥,下面给出几个示例点。

方法返回值尽量不要使用 null(特殊场景除外),这样可以避免很多 NullPointerException 异常。

catch 住了如果真的没必要处理则至少加行打印,这样可在将来方便排查问题。

接口方法抛出的异常尽量保证是运行时异常类型,除非迫不得已才抛出检查类型异常。

避免在 finally 中使用 return 语句或者抛出异常,如果调用的其他代码可能抛出异常则应该捕获异常并进行处理,因为 finally 中 return 不仅会覆盖 try 和 catch 内的返回值且还会掩盖 try 和 catch 内的异常,就像异常没有发生一样(特别注意,当 try-finally 中没有 return 时该方法运行会继续抛出异常)。

尽量不要在 catch 块中压制异常(即什么也不处理直接 return),因为这样以后无论抛出什么异常都会被忽略,以至没有留下任何问题线索,如果在这一层不知道如何处理异常最好将异常重新抛出由上层决定如何处理异常。

方法定义中 throws 后面尽量定义具体的异常列表,不要直接 throws Exception。

捕获异常时尽量捕获具体的异常类型而不要直接捕获其父类,这样不容易造成混乱。

避免在 finally 块中抛出异常,不然第一个异常的调用栈会丢失。

不要使用异常控制程序的流程,譬如本应该使用 if 语句进行条件判断的情况下却使用异常处理是非常不好的习惯,会严重影响性能。

不要直接捕获 Throwable 类,因为 Error 是 Throwable 类的子类,当应用抛出 Errors 的时候一般都是不可恢复的情况。

问:java 中 finally 块一定会执行吗?

答:不一定,分情况。

因为首先想要执行 finally 块的前提是必须执行到了 try 块,当在 try 块或者 catch 块中有 System.exit(0); 这样的语句存在时 finally 块就不会被执行到了,因为程序被结束了。

此外当在 try 块或者 catch 块里 return 时 finally 会被执行;而且 finally 块里 return 语句会把 try 块或者 catch 块里的 return 语句效果给覆盖掉且吞掉了异常。

问:java 中什么时候使用断言(assert)?

答:断言在开发中是一种常用的调试方式,很多开发语言中都支持这种机制。一般来说,断言用于保证程序最基本、关键的正确性,断言检查通常在开发和测试时开启,为了保证程序的执行效率,在软件发布后断言检查通常是关闭的,断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true,如果表达式的值为 false 则系统会报告一个 AssertionError。

相关文章:

UICollectionView之网络图片解析

1:将SDWebImage文件夹的类库导入工程,创建一个模型对象Model类,并声明好它的属性,再创建一个继承自UICollectionViewCell的自定义类 2:在自定义cell类中重写 - (instancetype)initWithFrame:(CGRect)frame { self [su…

一个中国人看了爽的笑话

某国人好战。古时几乎所有的少壮男丁都被征召去当兵打仗,根本没有时间结婚生子,所以人丁越来越少.当时一个国主就出了一个国策,让所有的男人不论何时何地,都可以随便跟任何女人发生关系,来保持人口的出生率.所以在休战…

Spring Cloud整合Redis

2019独角兽企业重金招聘Python工程师标准>>> 项目需要使用Redis来做缓存,研究了一下如何将其与Spring Boot整合。网上的demo要么就是太过于庞大,要么就是版本过于陈旧,配置时候会有各种坑。因此自己在踩过了各种坑之后&#xff0c…

java case or_java – 在CriteriaBuilder中使用子句和’case w...

我想使用CriteriaBuilder构建下面显示的having子句:select objectid,sum(case when attr_meta severity then 1 else 0 end) as severity,sum(case when attr_meta priority then 1 else 0 end) as priorityfrom object dgroup by objectidhaving sum(case when a…

7 个 jQuery 最佳实践

背景 在这篇文章中,我会给大家介绍在编写、调试和审查JavaScript代码的时候一些好的实践(至少我是这么认为的)。事实上,我选择了其中7个最常见的场景。 1、使用CDN及其回退地址(fallback) CDN代表内容传递网…

关于一些Linux SVN的安装使用

关于一些Linux SVN的安装使用 SVN简介The goal of the Subversion project is to build a version control system that is a compelling replacement for CVS in the open source community. The software is released under an Apache/BSD-style open source license.SVN是一…

【转】触屏手机电话拨打链接

1、web方式&#xff1a; <a href"tel:4008006666">电话&#xff1a;4008006666</a> 2、wap方式&#xff08;主要hack QQ和UC浏览器&#xff09; <a href"wtai://wp/mc;4008006666">电话&#xff1a;4008006666</a>转载于:https://…

java redis 主从 哨兵_Redis主从复制与哨兵机制

Redis主从复制1、redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave)&#xff0c;主数据库可以进行读写操作&#xff0c;当发生写操作的时候自动将数据同步到从数据库&#xff0c;而从数据库一般是只读的&#xff0c;并接收主数据库…

不同变量的区别

1、形参、局部变量以及局部静态变量的区别。 形参和局部变量均属于自动对象&#xff0c;当到达定义所在的块末尾时被销毁&#xff1b;而局部静态变量自定义开始&#xff0c;直到程序结束才被销毁。 2、全局变量和静态全局变量的区别。 全局变量本身就是静态存储方式&#xff0c…

Java 使用 Redis

2019独角兽企业重金招聘Python工程师标准>>> 安装 开始在 Java 中使用 Redis 前&#xff0c; 我们需要确保已经安装了 redis 服务及 Java redis 驱动&#xff0c;且你的机器上能正常使用 Java。 Java的安装配置可以参考我们的 Java开发环境配置 接下来让我们安装 Ja…

IPMSM弱磁控制策略

下面将详细介绍这种控制策略的实现过程:(l)具有快速动态响应的前馈弱磁控制策略电动汽车用永磁电动机驱动系统应具有较快的转速响应速度&#xff0c;而传统的的弱磁控制策略通常是先根据电机转速的变化调整交轴电流iq&#xff0c;而后根据转速给定值计算得出直轴电流id这种方法…

java 并发统计_java并发编程|CountDownLatch计数器

0x01,CountDownLatch介绍CountDownLatch是一个计数器&#xff0c;作为java并发编程中三个组件之一&#xff0c;这个组件的使用频率还是很多的。这里分享下自己画的java并发编程组件的图&#xff0c;后面一一介绍这几个组件的使用。上面图片标注的1,2,3分别是自己觉得重要性的&a…

MySQL查询随机数据的4种方法和性能对比

从MySQL随机选取数据也是我们最常用的一种发发&#xff0c;其最简单的办法就是使用”ORDER BY RAND()”,本文介绍了包括ORDER BY RAND()的4种获取随机数据的方法&#xff0c;并分析了各自的优缺点。下面从以下四种方案分析各自的优缺点。方案一&#xff1a; 复制代码 代码如下:…

【转】CPU位数、核数、个数

转自&#xff1a;http://blog.chinaunix.net/uid-20344928-id-2985712.html 32 or 64 linux下查看操作CPU的运行位数&#xff1a; getconf LONG_BIT 如结果是32&#xff0c;表示当前CPU工作在32位模式下&#xff08;即操作系统是32位的&#xff09;&#xff0c;但并不表示CPU一…

JPA常用注解

2019独角兽企业重金招聘Python工程师标准>>> JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象&#xff0d;关系表的映射关系&#xff0c;并将运行期的实体对象持久化到数据库中。 JPA由EJB 3.0软件专家组开发&#xff0c;作为JSR-220实现的一…

php pthread 实例,php 真正的多线程 pthread

对于php&#xff0c;有很多种多进程的实现&#xff0c;这里就不说了&#xff0c;下面介绍一种多线程的方式。php真正的多线程实现方式&#xff0c;通过安装php的扩展&#xff1a;pthread 扩展安装步骤如下&#xff1a;1.下载地址是这个&#xff1a;但是这个下载的是 版本3 也就…

Java基础学习总结(1)——equals方法

2019独角兽企业重金招聘Python工程师标准>>> 一、equals方法介绍 1.1.通过下面的例子掌握equals的用法 1 package cn.galc.test;2 3 public class TestEquals {4 public static void main(String[] args) {5 /**6 * 这里使用构造方法Cat()在堆…

动态规划:求最大公共子串

1 /// <summary>2 /// 动态规划&#xff1a;求最大公共子串3 /// LCS (Longest Common Subsequence)4 /// </summary>5 private static string LCS(string str1, string str2)6 { 7 var d …

java 不可最小化,java – 这是最小化绑定失效的有效方法吗?

我有一些复杂的Observable结构,这可能是也可能不是坏主意,但这不是这个问题的焦点.这些结构的问题在于它们会产生很多UI显示的Observable对象的失效.就像我所知道的那样,当JavaFX UI显示某些内容时,它在其上注册了ChangeListener,因此任何使用延迟评估的尝试都会消失.也就是说,…

让你的javascript函数拥有记忆功能,降低全局变量的使用

考虑例如以下场景&#xff1a;假如我们须要在界面上画一个圆&#xff0c;初始的时候界面是空白的。当鼠标移动的时候&#xff0c;圆须要尾随鼠标移动。鼠标的当前位置就是圆心。我们的实现方案是&#xff1a;假设界面上还没有画圆&#xff0c;那么就新创建一个&#xff1b;假设…

Maven学习总结(6)——Maven与Eclipse整合

2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(六)——Maven与Eclipse整合 一、安装Maven插件 下载下来的maven插件如下图所示&#xff1a;&#xff0c;插件存放的路径是&#xff1a;E:/MavenProject/Maven2EclipsePlugin 进入到eclipse中的dropins目录…

为python安装numpy和scipy(federo)

为了进行数值计算&#xff0c;例如积分等等&#xff0c;需要安装numpy和scipy&#xff0c;其中scipy是依赖于numpy的&#xff0c;所以先要装numpy. 1&#xff0c; 通过下载http://pypi.python.org/pypi/numpy&#xff0c;然后python set.up install安装&#xff0c;不过有些行不…

php执行mysql insert,当执行mysql insert 时插入两条是咋回事

当执行mysql insert 时插入两条是怎么回事&#xff1f;本帖最后由 Eason_____________ 于 2013-07-25 11:25:44 编辑//做了一个手机上传图片到服务器的功能。但是获取到执行insert语句时都要执行两次&#xff01;//index.phpheader("Content-Type: text/html; charsetUTF-…

产品经理要读什么书?怎么读?

产品相关知识可以在&#xff1a;http://www.aipingce.com/进行学习&#xff0c;本文转自&#xff1a;http://www.aipingce.com/article-22960-1.html 首先&#xff0c;我个人还是非常推荐大家看实体书的&#xff0c;原因如下&#xff0c;算是做个分析吧&#xff1a; 电子书是免…

HTML5:理解head

2019独角兽企业重金招聘Python工程师标准>>> HTML文档的head部分&#xff0c;通常包括指定页面标题&#xff0c;为搜索引擎提供关于页面本身的信息&#xff0c;加载样式表&#xff0c;以及加载JavaScript文件&#xff08;出于性能考虑&#xff0c;多数时候放在页面底…

php定时任务为什么不好写,php解决crontab定时任务不能写入文件问题的方法分析...

本文实例讲述了php解决crontab定时任务不能写入文件问题的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;今天使用crontab写的定时任务没有执行&#xff0c;很纳闷。crontab.phperror_reporting(0);$time date("Y-m-d h:i:s",time());file_put_conten…

SpringMVC权限管理

2019独角兽企业重金招聘Python工程师标准>>> 1.DispatcherServlet SpringMVC具有统一的入口DispatcherServlet&#xff0c;所有的请求都通过DispatcherServlet。 DispatcherServlet是前置控制器&#xff0c;配置在web.xml文件中的。拦截匹配的请求&#xff0c;Servl…

搭建Hadoop集群步骤

——基于三台机器 一、前提 1、 首先要有三台已联网机器&#xff0c;假设为A&#xff0c;B1&#xff0c;B2。其中A&#xff1a;192.168.81.91&#xff1b;B1:192.168.81.92&#xff1b;B2:192.168.81.93。机器装有Ubuntu10.04服务器版64位操作系统。 2、 对三台机器做相同的处…

使用DCloud+Framework7制作移动APP应用(一)

http://my.oschina.net/kenblog/blog/516201转载于:https://www.cnblogs.com/NodeStudy/p/5223273.html

nsq php,Nsq从入门到实践

当nsq跑起来之后, 我们可能会遇到以下问题分布式部署处理错误(何时requeue)如何使用golang lib抱着不应该只停留在入门的态度, 笔者粗浅的研究了一下这几个问题, 希望也对有同样疑问的人有帮助.部署由于NSQ的分布式网络结构, NSQD必须广播(到lookup)自己的地址并让消费者连接, …