expec不管异常 try_Java异常的面试问题及答案-Part 1

Java提供了一个健壮的、面向对象的方法来处理出现异常,称为Java异常处理。今天我将列出一些重要的Java异常面试的问题及答案,希望对你们的面试有所帮助。

1.什么是Java异常

答:异常是发生在程序执行过程中阻碍程序正常执行的错误事件。比如:用户输入错误数据、硬件故障、网络阻塞等都会导致出现异常。 只要在Java语句执行中产生了异常,一个异常对象就会被创建,JRE就会试图寻找异常处理程序来处理异常。如果有合适的异常处理程序,异常对象就会被异常处理程序接管,否则,将引发运行环境异常,JRE终止程序执行。 Java异常处理框架只能处理运行时错误,编译错误不在其考虑范围之内。

2.Java异常处理中有哪些关键字?

答:

  • throw:有时我们需要显式地创建并抛出异常对象来终止程序的正常执行。throw关键字用来抛出并处理运行时异常。
  • throws:当我们抛出任何“被检查的异常(checked exception)”并不处理时,需要在方法签名中使用关键字throws来告知调用程序此方法可能会抛出的异常。调用方法可能会处理这些异常,或者同样用throws来将异常传给上一级调用方法。throws关键字后可接多个潜在异常,甚至是在main()中也可以使用throws。
  • try-catch:我们在代码中用try-catch块处理异常。当然,一个try块之后可以有多个catch子句,try-catch块也能嵌套。每个catch块必须接受一个(且仅有一个)代表异常类型的参数。
  • finally:finally块是可选的,并且只能配合try-catch一起使用。虽然异常终止了程序的执行,但是还有一些打开的资源没有被关闭,因此,我们能使用finally进行关闭。不管异常有没有出现,finally块总会被执行。

3.描述一下异常的层级。

答:Java异常是层级的,并通过继承来区分不同种类的异常。

  • Throwable是所有异常的父类,它有两个直接子对象Error,Exception,其中Exception又被继续划分为“被检查的异常(checked exception)”和”运行时的异常(runtime exception,即不受检查的异常)”。 Error表示编译时和系统错误,通常不能预期和恢复,比如硬件故障、JVM崩溃、内存不足等。
  • 被检查的异常(Checked exception)在程序中能预期,并要尝试修复,如FileNotFoundException。我们必须捕获此类异常,并为用户提供有用信息和合适日志来进行调试。Exception是所有被检查的异常的父类。
  • 运行时异常(Runtime Exception)又称为不受检查异常,源于糟糕的编程。比如我们检索数组元素之前必须确认数组的长度,否则就可能会抛出ArrayIndexOutOfBoundException运行时异常。RuntimeException是所有运行时异常的父类。

4.Java异常类有哪些的重要方法?

答:Exception和它的所有子类没有提供任何特殊方法供使用,它们的所有方法都是来自其基类Throwable。

  • String getMessage():方法返回Throwable的String型信息,当异常通过构造器创建后可用。
  • String getLocalizedMessage():此方法通过被重写来得到用本地语言表示的异常信息返回给调用程序。Throwable类通常只是用getMessage()方法来实现返回异常信息。
  • synchronized Throwable getCause():此方法返回异常产生的原因,如果不知道原因的话返回null。(原文有拼写错误 应该是if 不是id)
  • String toString():方法返回String格式的Throwable信息,此信息包括Throwable的名字和本地化信息。
  • void printStackTrace():该方法打印栈轨迹信息到标准错误流。该方法能接受PrintStream 和PrintWriter作为参数实现重载,这样就能实现打印栈轨迹到文件或流中。

5.描述Java 7 ARM(Automatic Resource Management,自动资源管理)特征和多个catch块的使用

答:如果一个try块中有多个异常要被捕获,catch块中的代码会变丑陋的同时还要用多余的代码来记录异常。有鉴于此,Java 7的一个新特征是:一个catch子句中可以捕获多个异常。示例代码如下:

5bcc71307469afea7e95397d447817d2.png

大多数情况下,当忘记关闭资源或因资源耗尽出现运行时异常时,我们只是用finally子句来关闭资源。这些异常很难调试,我们需要深入到资源使用的每一步来确定是否已关闭。因此,Java 7用try-with-resources进行了改进:在try子句中能创建一个资源对象,当程序的执行完try-catch之后,运行环境自动关闭资源。下面是这方面改进的示例代码:

d3a0bc2bfd2ec1db77d808c9463ceb1b.png
10831596ebf271a81b996155f7ff1875.png
java中使用interrupt通知线程停止 这里的 if (Thread.currentThread().isInterrupted()) 判断,就是要你的代码有响应中断的能力。但是由于 sleep 设计理念,导致 Thread.currentThread().isInterrupted() 标记位会被清除,也就是说,虽然线程在 sleep 过程中收到了 interrupt 中断通知,并且也捕获到了异常、打印了异常信息,所以说,不要以为调用了 interrupt() 方法,线程就一定会停止。通知线程停止,线程不会立即停止,而是会在合适的时候停止。 阅读详情

相关推荐

课堂练习1- Python语言基础

本关任务:利用 Python 提供的print()内置函数,打印输出Hello Python,初步体验和感受Python编程的魅力。input()函数从控制台获得用户输入,无论用户在控制台输入什么内容,input()函数都以字符串类型返回结果。为了完成本关任务,你需要掌握:1. input函数,2. print函数。本关任务:改正代码中不正确的缩进,使其能够正常编译,并输出正确的结果。为了完成本关任务,你需要掌握:1.print函数。为了完成本关任务,你需要掌握:缩进。本关任务:完成数据类型简单测试语句。

Junds0的博客 533

线程sleep方法和InterruptedException异常

知道为啥每次调用Thread.sleep(...)方法时,都要求你捕获InterruptedException异常吗?sleep方法和 interrupt方法的关系又是什么呢?

weixin_67049753的博客 4064

sleep、interrupt等线程相关方法介绍

另外,打断处于执行在sleep,wait,join等方法的线程会将改线程的打断状态标记为false,表示没有被打断。如果打断的是正常执行的线程,则会将打断状态改成true,但是实际上只是修改了这个标记,并没有真的打断线程的执行,如果我们想让这个打断生效需要自己编写业务逻辑的代码让我们的线程终止。用interrupt方法打断处于park的线程,会将这个线程的打断状态置为true,并且如果再次执行park方法并不能暂停线程的执行,这也是park方法的特点,只能打断打断标志是false的线程。

怕什么真理无穷,进一寸有一寸的欢喜。即使开了一辆老掉牙的破车,只要在前行就好,偶尔吹点小风,这就是幸 1731

异常机制以及自定义异常

异常分类(异常—>Exception) 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。 例如要打开一个不存在的文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。 运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。 错误ERROR:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。 异常体系结构 Error Erro

weixin_46649583的博客 1899

java.lang.InterruptedException: sleep interrupted异常

确实是打断睡眠状态了,在使用线程池中,等线程启动完毕,开始运行,却执行了exe.shutdown()方法,该方法使得主线程强行打断子线程的sleep状态,因此抛出此异常,根据实际情况,去掉了shutdown()这个不合理的方法,解决该异常。 转载于:https://www.cnblogs.com/xxdfly/p/5645123.html...

weixin_33736048的博客 5074

Java高并发3-中断线程以及isInterrupted与interrupted区别

一、复习上一节内容 wait()方法、中断正在运行的线程会抛出java.lang.InterruptedException、当线程调用共享对象的wait()方法时,当前线程只会释放当前共享变量的锁,不会释放该线程所持有的其他共享变量的锁。 wait(long timeout,int nanos)实现、wait(0)内部调用了wait()方法、notify()随机唤醒、notifyAll()全部唤醒、join方法、sleep方法、yield方法,以及sleep与yield方法的区别 二、线程中断inter

weixin_44630050的博客 676

java.lang.ArithmeticException: / by zero 异常处理

使用 BigDecimal.divide() 除法计算时报 java.lang.ArithmeticException: / by zero 异常 错误事例: 报 java.lang.ArithmeticException: / by zero 异常的原因是因为被除数为0 解决办法: if ((BigDecimal.ZERO).compareTo(deci2) == 0 ) { System.out.println("被除数为 0 不能使用BigDecimal.divide()除法函数

weixin_46756314的博客 2万+

java并发编程的一些知识

目录 线程分为哪几种状态? wait/sleep的区别 并发/并行的区别 管程 用户线程/守护线程 同步和异步 线程上下文切换 线程常用方法 常见线程安全类 线程分为哪几种状态? java线程分为六种状态 new 新建 runnable 可运行 blocked 阻塞 waiting 等待 time waiting 限时等待 termingted 终结 getState()方法可获取当前线程的状态 操作系统线程分为五种状态 分到cpu时间的:运行 可以分到c..

m0_60264772的博客 2493

python 代码遇到 float division by zero 怎么解决?

当我们在 Python 代码中进行除法运算时,可能会遇到 "float division by zero" 的错误。这种错误通常发生在除数为 0 时。在这篇文章中,我们将介绍如何避免和解决这个问题

devid008的博客 1万+

线程中断异常java.lang.InterruptedException: sleep interrupted

线程中含有如下语句导致中断异常 sleep(500); 原因: void interrupt() 如果线程处于被阻塞状态(例如处于 sleep, wait, join 等状态),那么线程将立即退出被阻塞状态,并抛出一个InterruptedException 异常 如果线程处于正常活动状态,那么会将该线程的中断标志设置为 true。被设置中断标志的线程将继续正常运行,不受影响 参考链接:https://www.jianshu.com/p/5f368f9a5734 ...

weixin_44187116的博客 1万+

一文彻底搞懂线程中断interrupt导致sleep报InterruptException

处理InterruptedException异常时要小心,如果在调用执行线程的interrupt()方法中断执行线程时,抛出了InterruptedException异常,则在触发InterruptedException异常的同时,JVM会同时把执行线程的中断标志位清除,此时调用执行线程的isInterrupted()方法时,会返回false。

t1750982356的博客 3541

Thread相关的重要方法,interrupted与sleep同时使用

异常由interrupt()引起,Interrupt()让sleep的睡眠时间变为不确定因素,如果线程t1睡眠时调用Interrupt方法会使sleep提前唤醒,此时sleep抛出异常,同时清除interrupted()的标志位变回false,例如:上厕所每个隔间都有一把锁,一个线程拿到这把锁,其他线程就必须等带此线程执行完毕,其他线程再去竞争锁,得到锁后此线程执行,其他持有相同锁的线程等待(阻塞)随便创建个对象就可以用来加锁,但是一定要记住对同一对象上锁,不然不会阻塞!之后t1.isAlive();

a13931329858的博客 1003

API—Exception异常类概述分析

异常类:Throwable类—异常的顶级父类 异常的处理:要么抛出要么处理,只有两种方式,没有其他的方式 主要异常1. 编译时异常---一定要进行处理 除了RuntimeException类以及子类以外其他的异常类 2. 运行时异常---在运行时出错,可以处理也可以不进行处理 RuntimeException类以及子类的其他异常...

虚空掠夺者~ 3561

java sleep 抛出异常_java.lang.InterruptedException: sleep interrupted

以下是main函数中的代码,想测试一下shutdownNow的效果。public class TestLa {public static void main(String... args){/*省略了一段无意义的测试代码*/ExecutorService executorService = Executors.newFixedThreadPool(2);class Task implements ...

weixin_29038537的博客 4119

java线程中断、睡眠、等待

目录零、前言线程状态图睡眠(sleep)Demo说明等待(wait)Demo说明wait使用方式synchronized唤醒(notify)wait(), object对象,线程三者关系小结使用Lock实现类似的功能中断(interrupt)一般用法Demo说明中断sleepDemo说明中断waitDemo停止Demo小结总结 零、前言 在应用线程的时候,启动后,线程就像脱缰的二哈一样不受控制的...

yunduanyou的博客 3717

异常的介绍

Java中定义了大量的异常类,虽然这些异常类可以描述编程时出现的大部分异常情况,但是在程序开发中有时可能需要描述程序中特定的异常情况,例如在设计divide()方法时不允许除数为0,为了解决这样的问题Java允许用户自定义异常类,但自定义的异常类必须继承至Exception或其子类。接下来通过一个案例来学习自定义异常的创建。package 异常;}}}if(y==0){throw new DivideByMinusException("除数是0");}}try {

qq_51768153的博客 1758

sleep interrupted

本案例在testng中遇到,意思是用例超过了,写的超时时间,把超时时间改大点就行了。 didn't finish within the time-out 60000 public class TestTimeout { @Test(timeOut = 5000) // time in mulliseconds public void testThisShouldPass() throws InterruptedException { Thread.sleep(4000); } ..

bobo的博客 1898
上一篇: python 修饰符**kwag_python-如何修饰一个类的所有功能而不用为每个方法一遍又一遍地键入?...
下一篇: 离职通知邮件主题写什么好_辞职邮件怎么写
明星代言那些事儿
博客等级 码龄6年 35粉丝 863原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值