首页 > 编程知识 正文

内部竞聘主管面试问题解答,换部门面试可能问到的问题

时间:2023-05-06 02:59:44 阅读:34727 作者:2842

Throwable是所有Java程序错误处理的父类,有两种资源类: Error和Exception。

错误:表示JVM检测到的意外错误。 这是JVM级别的严重错误,因此无法再运行JVM。 因此,这是不可捕捉的,无法进行恢复操作。 只会显示错误信息。

Exception :表示可恢复的异常。 这个可以捕捉。

Java提供了两种主要的异常:运行时执行和checked执行。 checked异常,也就是我们经常遇到的IO异常和SQL异常就是这个异常。 对于此异常,JAVA编译器强制要求必须捕获这些异常。 所以,面对这样的异常,不管我们是否愿意,只能自己写很多catch块来处理可能的异常。

但另一个异常: runtime exception也被称为运行时异常,我们可以不处理。 如果发生这种异常,虚拟机将始终接管。 例如,我们没有处理过NullPointerException异常。 那是运行时异常。 而且,这种异常是最常见的异常之一。

如果发生运行时异常,系统会继续将异常扔向更高层,并遇到处理代码。 如果未处理块,则抛出到顶层;如果是多线程,则抛出Thread.run (,如果是单线程,则抛出main ) )。 扔出去后,如果是线程,这个线程也会退出。 如果主程序抛出的异常,则整个程序也将退出。 运行时异常是Exception的子类,也有常见异常的特点,可以在Catch块中处理。 但是,我们往往不处理他。 也就是说,如果不应对运行时异常,则发生运行时异常后,线程会中止,或者主程序会退出。

如果不想结束,则必须捕捉所有运行时异常,以免结束此处理线程。 队列中包含异常数据。 正常处理是销毁异常数据并记录日志。 不应该让异常数据影响以下正常数据的处理。 在这个场景中这样处理可能是一个很好的APP应用,但并不是所有场景中你都应该这样做。 在其他场景中,如果发生任何错误,最好退出程序,则可以在运行时忽略太多异常,也可以通过对异常的处理显式退出程序。

异常处理的目标之一是为了使程序从异常中恢复。

转自: http://blog.csdn.net/yaki happy/archive/2009/03/11/3979883.aspx

异常表示程序运行期间可能出现的非正常状态,运行时异常表示虚拟机正常操作期间可能出现的异常,是常见的运行错误。 java编译器必须在方法中声明可能出现的非运行时异常的抛出,但不需要声明未捕获的运行时异常的抛出。

简要说明有关JAVA异常的知识:

1 .异常机制

1.1

异常机制是程序发生错误后,程序如何处理。 具体而言,异常机制为程序退出提供了安全的渠道。 发生错误后,程序执行的流发生更改,程序控制权转移给异常处理器。

1.2

传统的处理异常的方法是返回函数表示异常的非凡结果,并检查和分析其结果。 这样,例如函数返回-1时表示异常,但函数返回-1这样正确的值时会混淆; 在调用混淆程序代码和处理异常的代码的函数的程序中分析错误会使客户程序员对库函数有更深的理解

1.3异常处理流程

1.3.1发生错误时,方法立即终止,不返回一个值; 同时,抛出异常对象

lor:rgb(51,51,51)">    1.3.2 调用该方法的程序也不会继续执行下去,而是搜索一个可以处理该异常的异常处理器,并执行其中的代码

    2 异常的分类

    2.1 异常的分类

    2.1.1

    异常的继续结构:基类为Throwable,Error和Exception继续Throwable,RuntimeException和 IOException等继续Exception,具体的RuntimeException继续RuntimeException.

    2.1.2

    Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked).

    2.2 每个类型的异常的特点

    2.2.1 Error体系

    Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形.应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出).假如出现这种错误, 除了尽力使程序安全退出外,在其他方面是无能为力的.所以,在进行程序设计时,应该更关注Exception体系.

    2.2.2 Exception体系

    Exception体系包括RuntimeException体系和其他非RuntimeException的体系

    2.2.2.1 RuntimeException

    RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等.处理RuntimeException的原则是:假如出现 RuntimeException,那么一定是程序员的错误.例如,可以通过检查数组下标和数组边界来避免数组越界访问异常.

    2.2.2.2 其他(IOException等等)

    这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误.

    2.3 与C++异常分类的不同

    2.3.1

    其实,Java中RuntimeException这个类名起的并不恰当,因为任何异常都是运行时出现的.(在编译时出现的错误并不是异常,换句话说,异常就是为了解决程序运行时出现的的错误).

    2.3.2

    C++中logic_error与Java中的RuntimeException是等价的,而runtime_error与Java中非RuntimeException类型的异常是等价的.

    3 异常的使用方法

    3.1 声明方法抛出异常

    3.1.1 语法:throws(略)

    3.1.2 为什么要声明方法抛出异常?

    方法是否抛出异常与方法返回值的类型一样重要.假设方法抛出异常确没有声明该方法将抛出异常,那么客户程序员可以调用这个方法而且不用编写处理异常的代码.那么,一旦出现异常,那么这个异常就没有合适的异常控制器来解决.

    3.1.3 为什么抛出的异常一定是已检查异常?

    RuntimeException与Error可以在任何代码中产生,它们不需要由程序员显示的抛出,一旦出现错误,那么相应的异常会被自动抛出.而已检 查异常是由程序员抛出的,这分为两种情况:客户程序员调用会抛出异常的库函数(库函数的异常由库程序员抛出);客户程序员自己使用throw语句抛出异 常.碰到Error,程序员一般是无能为力的;碰到RuntimeException,那么一定是程序存在逻辑错误,要对程序进行修改(相当于调试的一种 方法);只有已检查异常才是程序员所关心的,程序应该且仅应该抛出或处理已检查异常.

    3.1.4

    注重:覆盖父类某方法的子类方法不能抛出比父类方法更多的异常,所以,有时设计父类的方法时会声明抛出异常,但实际的实现方法的代码却并不抛出异常,这样做的目的就是为了方便子类方法覆盖父类方法时可以抛出异常.

    3.2 如何抛出异常

    3.2.1 语法:throw(略)

    3.2.2 抛出什么异常?

    对于一个异常对象,真正有用的信息时异常的对象类型,而异常对象本身毫无意义.比如一个异常对象的类型是ClassCastException,那么这个类名就是唯一有用的信息.所以,在选择抛出什么异常时,最要害的就是选择异常的类名能够明确说明异常情况的类.

    3.2.3

    异常对象通常有两种构造函数:一种是无参数的构造函数;另一种是带一个字符串的构造函数,这个字符串将作为这个异常对象除了类型名以外的额外说明.

    3.2.4

    创建自己的异常:当Java内置的异常都不能明确的说明异常情况的时候,需要创建自己的异常.需要注重的是,唯一有用的就是类型名这个信息,所以不要在异常类的设计上花费精力.

    3.3 捕捉异常

    假如一个异常没有被处理,那么,对于一个非图形界面的程序而言,该程序会被中止并输出异常信息;对于一个图形界面程序,也会输出异常的信息,但是程序并不中止,而是返回用户界面处理循环中.

    3.3.1 语法:try、catch和finally(略)

    控制器模块必须紧接在try块后面.若掷出一个异常,异常控制机制会搜寻参数与异常类型相符的第一个控制器随后它会进入那个catch

    从句,并认为异常已得到控制.一旦catch 从句结束对控制器的搜索也会停止.

    3.3.1.1 捕捉多个异常(注重语法与捕捉的顺序)(略)

    3.3.1.2 finally的用法与异常处理流程(略)

    3.3.2 异常处理做什么?

    对于Java来说,由于有了垃圾收集,所以异常处理并不需要回收内存.但是依然有一些资源需要程序员来收集,比如文件、网络连接和图片等资源.

    3.3.3 应该声明方法抛出异常还是在方法中捕捉异常?

    原则:捕捉并处理哪些知道如何处理的异常,而传递哪些不知道如何处理的异常

    3.3.4 再次抛出异常

    3.3.4.1 为什么要再次抛出异常?

    在本级中,只能处理一部分内容,有些处理需要在更高一级的环境中完成,所以应该再次抛出异常.这样可以使每级的异常处理器处理它能够处理的异常.

    3.3.4.2 异常处理流程

    对应与同一try块的catch块将被忽略,抛出的异常将进入更高的一级.

    4 关于异常的其他问题

    4.1 过度使用异常

    首先,使用异常很方便,所以程序员一般不再愿意编写处理错误的代码,而仅仅是简简单单的抛出一个异常.这样做是不对的,对于完全已知的错误,应该编写处理这种错误的代码,增加程序的鲁棒性.另外,异常机制的效率很差.

    4.2 将异常与普通错误区分开

    对于普通的完全一致的错误,应该编写处理这种错误的代码,增加程序的鲁棒性.只有外部的不能确定和预知的运行时错误才需要使用异常.

    4.3 异常对象中包含的信息

    一般情况下,异常对象唯一有用的信息就是类型信息.但使用异常带字符串的构造函数时,这个字符串还可以作为额外的信息.调用异常对象的 getMessage()、toString()或者printStackTrace()方法可以分别得到异常对象的额外信息、类名和调用堆栈的信息.并 且后一种包含的信息是前一种的超集.

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。