天天看点

Java异常异常总结面试题

本文是课上资料的总结非原创没有转载地址

目录

  • 异常
    • 1.异常的概念
      • 什么是异常
    • 2.异常的分类
      • 常见运行时异常
    • 3.异常的产生
    • 4.异常的传递
    • 5.异常的处理
      • 异常处理try...catch
      • 异常处理try...catch...finally
      • 异常处理 多重catch
      • 异常处理 多重catch
      • 总结异常处理
    • 6.声明异常
    • 7.抛出异常
      • 方法覆盖(重写)
    • 8.自定义异常
  • 总结
  • 面试题

异常

1.异常的概念

什么是异常

  • 概念:

    程序在运行过程中出现的特殊情况。

  • 异常处理的必要性:

    任何程序都可能存在大量的位置问题、错误;如果不对这些问题进行正常处理,则可能导致程序的中断,造成不必要的损失。

  • 异常处理:Java编程语言使用异常处理机制为程序提供了异常处理的能力。

2.异常的分类

Java异常异常总结面试题
  • Throwable:可抛出的,一切错误或异常的父类,位于java.lang包中。
    • Error:JVM、硬件、执行逻辑错误,不能手动处理。
      • StackOverflowError:栈溢出错误
      • OutOfMemoryError:内存不足错误
    • Exception:程序在运行和配置中产生的问题,可处理。
      • RuntimeException:运行时异常,可处理,可不处理。
      • CheckedException:检查时异常,必须处理。(没有实体,除去RuntimeException都属于CheckedException)

常见运行时异常

类型 说明
NullPointerException 空指针异常
ArrayIndexOutOfBoundsException 数组越界异常
NegativeArrayException 数组负下标异常
ClassCastException 类型转换异常
NumberFormatException 数字格式化异常
ArithmeticException 算术异常
SecturityException 违背安全原则异常
EOFException 文件已结束异常
FileNotFoundException 文件未找到异常
SQLException 操作数据库异常
IOException 输入输出异常
NoSuchMethodException 方法未找到异常

ConcurrentModificationException

并发修改异常

3.异常的产生

  • 当程序在运行时遇到不符合规范的代码或结果时,会产生异常或程序员使用throw关键字手动抛出。

4.异常的传递

  • 按照方法的调用链反向传递,如始终没有处理异常,最终会由JVM惊醒默认异常处理(打印堆栈跟踪信息)。

5.异常的处理

  • Java的异常处理是通过5个关键字来实现的:
    • ** — try**:执行可能产生异常的代码
    • ** — catch**:捕获异常,并处理
    • ** — finally**:无论是否发生异常,代码总能执行
    • ** — throw**:手动抛出异常
    • ** — throws**:声明方法可能要抛出的各种异常

异常处理try…catch

try{
	//	可能出现异常的代码
} catch(Exception e) {
	//	异常处理的相关代码,如:getMessage()、printStackTrace()
}
           

三种情况:

  • 正常请求
  • 出现异常并处理
  • 异常类型不配备

异常处理try…catch…finally

try{
	//	可能出现异常的代码
} catch(Exception e) {
	//	异常处理的相关代码,如:getMessage()、printStackTrace()
} finally {
	//	是否发生异常都会执行,可以释放资源等...
}
           

(1)finally块是否发生异常都执行

(2)finally块不执行的唯一情况,退出Java虚拟机(JVM)

异常处理 多重catch

try{
	//	可能出现异常的代码
} catch(异常类型1) {
	//	满足异常类型1执行的相关代码
} catch(异常类型2) {
	//	满足异常类型2执行的相关代码
} catch(异常类型3) {
	//	满足异常类型3执行的相关代码
}
           

(1)子类异常在前,父类异常在后(否则会有检查错误)

(2)发生异常时按顺序逐个匹配

(3)只执行第一个与异常类型匹配的catch语句

(4)finally根据需要可写或不写

注意:多重catch,遵循从子(小)到父(大)的顺序,父类异常在最后。

异常处理 多重catch

try{
	//	可能出现异常的代码
} finally {
	//	是否发生异常都会执行,可以释放资源等...
}
           
  • try…finally不能捕获异常,仅仅用来当发生异常时,用来释放资源。
  • 一般用在底层代码,只释放支援不做异常处理吗,把异常向上抛出。

总结异常处理

  • try{ } catch { }
  • try{ } catch { } finally { }
  • try{ } catch { } catch { }
  • try{ } finally { }
注意:多重catch,遵循从子(小)到父(大)的顺序,父类异常在最后。

6.声明异常

  • 如果在一个方法体中抛出了异常,如何通知调用者?
  • throws关键字:声明异常
  • 使用原则:底层代码向上声明或则抛出异常,最上层一定要处理异常,否则程序中断。

7.抛出异常

  • 除了系统自动抛出异常外,有些问题需要程序员自行抛出异常。
  • throw关键字:抛出异常
  • 语法:throw异常对象;

方法覆盖(重写)

带有异常声明的方法覆盖(重写):

  • 方法名、参数列表、返回值类型必须和父类相同。
  • 子类的访问修饰符和父类相同或是比父类更宽。
  • 子类中的方法,不能抛出比夫雷更多、更宽的异常(检查时异常)。

8.自定义异常

  • 需要继承Exception或Exception的子类,常用RuntimeException。
  • 必要提供的构造方法:
    • 无参数构造方法
    • String message 参数的构造方法

总结

  • 异常的概念:

    程序在运行过程中出现的特殊情况。

  • 异常的分类:

    RuntimeException:运行时异常,可处理,可不处理。

    CheckedException:检查时异常,必须处理。

  • 异常的产生:

    程序遇到错误,或手动抛出异常

  • 异常的传递:

    按照方法的调用链反向传递,如始终没有处理异常,最终会有JVM进行默认异常处理(打印堆栈跟踪信息)。

  • 异常的处理:

    try { } catch { } finally { }

  • 带有异常声明的方法覆盖:

    子类中的方法,不能抛出比父类更多、更宽的异常。

面试题

(1)try catch finally 是否可以使用return ?如果包含请说明执行过程?

  • try、catch、finally都可以添加return,但是不建议在finally中添加return,返回结果可能有问题。
  • 如果try 中没有异常,先执行try 再执行finally ,最后再执行try中的return
  • 如果try 中有异常,则执行catch, 再执行finally,最后再执行catch中return
public static int getNum(){
	try{
		//代码
		int n=10/0;
		return 10;
	}catch (Exception e){
		return 20;
	}finally {
		System.out.println("释放资源");
		//资源释放
		//return 30;
	}
}
           

(2)try catch finally 中return嵌套++

public static int getNum(){
	int n = 10;
	try{
		return n++;
	}catch (Exception e){
		return n++;
	}finally {
		return n++;
		System.out.println(n);
	}
}
//	返回值是“11”、n = 12;