当前位置:   article > 正文

java面试题-异常关键字_java\声明异常时使用下列哪个关键字

java\声明异常时使用下列哪个关键字

异常关键字


  • try-用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
  • catch-用于捕获异常。catch用来捕获try语句块中发生的异常。
  • finally-finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
  • throw-用于抛出异常。
  • throws-用在方法签名中,用于声明该方法可能抛出的异常。
    在这里插入图片描述
    Java通过面向对象的方法进行异常处理,一旦方法抛出异常,系统自动根据该异常对象寻找合适异常处理器(Exception Handler)来处理该异常,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。

在java应用中,异常的处理机制分为声明异常,抛出异常和捕获异常。

声明异常


通常,应该捕获那些知道如何处理的异常,将不知道如何处理的异常继续传递下去。传递异常可以在方法签名处使用throws关键字声明可能会抛出的异常。
注意

  • 非检查异常(Error、RuntimeException或它们的子类)不可使用throws关键字来声明要抛出的异常。
  • 一个方法出现编译时异常,就需要try-catch/throws处理,否则会导致编译错误。

抛出异常


如果你觉得解决不了某些异常问题,且不需要调用者处理,那么你可以抛出异常。
throw关键字作用是在方法内部抛出一个Throwable类型的异常。任何Java代码都可以通过throw语句抛出异常。

捕获异常


程序通常在运行之前不报错,但是运行后可能会出现某些未知的错误,但是还不想直接抛出到上一级,那么就需要通过try…catch…的形式进行异常捕获,之后根据不同的异常情贺来进行相应的处理。

如何选择异常类型


可以根据下图来选择是捕获异常,声明异常还是抛出异常
在这里插入图片描述

常见异常处理方式


直接抛出异常


通常,应该捕获那些知道如何处理的异常,将不知道如何处理的异常继续传递下去。传递异常可以在方法签名处使用throws关键字声明可能会抛出的异常。

private static void readFile(String filepath) throws IoException{
	File file=new File(filePath); 
	String result;
	BufferedReader reader=new BufferedReader(new FileReader(file));
	while((result=reader. readLine())!=nul1){
	system. out. print1n(result); 
	reader. close();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

封装异常再抛出


有时我们会从catch中抛出一个异常,目的是为了改变异常的类型。多用于在系统集成时,当某个子系统故障,异常类型可能有多种,可以用统一的异常类型向外霸露,不需暴露太多内部异常细节。

private static void readFile(String filePath) throws MyException{
	try{
		//code
	}catch(IOException e){
		MyException ex=new MyException("read file failed.");
		ex.initCause(e);
		throw ex;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

捕获异常


在一个try-catch语句块中可以捕获多个异常类型,并对不同类型的异常做出不同的处理

private static void readFile(String filepath){
	try{
		//code
	}catch(FileNotFoundException e){
		//handte FileNotFoundException
	}catch(IOException e){
		//handLe IOException
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

同一个catch也可以捕获多种类型异常,用|隔开

private static void readFile(String filePath){
	try{
		//code
	}catch(FileNotFoundException|UnknownHostException e){
		//handte FileNotFoundException or UnknownHostException
	}catch(IOException e){
		//handle IOException
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

自定义异常


习惯上,定义一个异常类应包含两个构造函数,一个无参构造函数和一个带有详细描述信息的构造函数(Throwable的toString方法会打印这些详细信息,调试时很有用)

public class MyException extends Exception{
	public MyException(){}
	public MyException(String msg){
		super(msg);
	}
	//...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

try-catch-finally


当方法中发生异常,异常处之后的代码不会再执行,如果之前获取了一些本地资源需要释放,则需要在方法正常结束时和catch语句中都调用释放本地资源的代码,显得代码比较繁琐,finally 语句可以解决这个问题。

private static void readFile(String filepath) throws MyException{
	File file=new File(filePath); 
	string result; 
	BufferedReader reader=nul1;
	try{
		reader=new BufferedReader(new FileReader(file));
		while((result=reader. readLine())!=nul1){
			system. out. println(result);
		}
	} catch(IoExceptione){
			system. out. println("readFile method catch block.");
			MyException ex=new MyException("read file failed.");
			ex. initCause(e);
			throw ex;
		} 
		finally{
			system. out. println("readFile method finally block.");
		if(null != reader){
		try{
			reader. close();
		} catch(IOException e){
			e. printstackTrace();
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

调用该方法时,读取文件时若发生异常,代码会进入catch代码块,之后进入finally代码块;若读取文件时未发生异常,则会跳过catch代码块直接进入finally代码块。所以无论代码中是否发生异常,fianlly中的代码都会执行。

若catch代码块中包含return 语句,finally中的代码还会执行吗?将以上代码中的catch子句修改如下:

catch(IOException e){
	System. out. printin("readFile method catch block.");
	return;
}
  • 1
  • 2
  • 3
  • 4

调用readFile方法,观察当catch子句中调用return 语句时,finally子句是否执行

readFile method catch block.
readFile method finally block.
  • 1
  • 2

可见,即使catch中包含了return语句,finally子句依然会执行。若finally中也包含return语句,finally中的return会覆盖前面的return.

try-with-resource


上面例子中,finally中的close方法也可能抛出I0Exception,从而覆盖了原始异常。JAVA
7提供了更优雅的方式来实现资源的自动释放,自动释放的资源需要是实现了AutoCloseable接口的类。

private static void tryWithResourceTest(){
	try(Scanner scanner = new Scanner(new FileInputStream("c:/abc"),"UTF-8")){
		//code
	}catch(IOException e){
		//handle exception
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

try代码块退出时,会白动调用scanner.close方法,和把scanner.close方法放在finally代码块中不同的是,若scanner.close抛出异常,则会被抑制,抛出的仍然为原始异常。被抑制的异常会由addSusppressed方法添加到原来的异常,如果想要获取被抑制的异常列表,可以调用getSuppressed方法来获取。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/252839
推荐阅读
相关标签
  

闽ICP备14008679号