当前位置: 主页 > JAVA语言

java ioexception异常-JAVA异常类型结构Throwable,群里有阿里大牛直播讲解技术

发布时间:2023-06-30 11:15   浏览次数:次   作者:佚名

JAVA 异常类型结构

Throwable 是所有异常类型的基类,Throwable 下一层分为两个分支,Error 和 Exception.

java下标越界异常怎么处理_java中处理异常语句_java ioexception异常

Error 和 Exeption

受查异常和非受查异常

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

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())!=null) {
 System.out.println(result);
 }
 reader.close();
}
private static void readFile(String filePath) {
 File file = new File(filePath);
 String result;
 BufferedReader reader;
 try {
 reader = new BufferedReader(new FileReader(file));
 while((result = reader.readLine())!=null) {
 System.out.println(result);
 }
 reader.close();
 } catch (IOException e) {
 e.printStackTrace();
 }
}

异常的抛出与捕获

java中处理异常语句_java ioexception异常_java下标越界异常怎么处理

直接抛出异常

通常,应该捕获那些知道如何处理的异常,将不知道如何处理的异常继续传递下去。传递异常可以在方法签名处使用 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())!=null) {
 System.out.println(result);
 }
 reader.close();
}

封装异常再抛出

有时我们会从 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;
 }
}

java下标越界异常怎么处理_java中处理异常语句_java ioexception异常

捕获异常

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

private static void readFile(String filePath) {
 try {
 // code
 } catch (FileNotFoundException e) {
 // handle FileNotFoundException
 } catch (IOException e){
 // handle IOException
 }
}

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

private static void readFile(String filePath) {
 try {
 // code
 } catch (FileNotFoundException | UnknownHostException e) {
 // handle FileNotFoundException or UnknownHostException
 } catch (IOException e){
 // handle IOException
 }
}

自定义异常

java中处理异常语句_java ioexception异常_java下标越界异常怎么处理

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

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

public class MyException extends Exception {
 public MyException(){ }
 public MyException(String msg){
 super(msg);
 }
 // ...
}​​

try-catch-finally

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

private static void readFile(String filePath) throws MyException {
 File file = new File(filePath);
 String result;
 BufferedReader reader = null;
 try {
 reader = new BufferedReader(new FileReader(file));
 while((result = reader.readLine())!=null) {
 System.out.println(result);
 }
 } catch (IOException e) {
 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();
 }
 }
 }
}

java中处理异常语句_java ioexception异常_java下标越界异常怎么处理

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

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

catch (IOException e) {
 System.out.println("readFile method catch block.");
 return;
}

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

java中处理异常语句_java ioexception异常_java下标越界异常怎么处理

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

java中处理异常语句_java ioexception异常_java下标越界异常怎么处理

try-with-resource

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

private static void tryWithResourceTest(){
 try (Scanner scanner = new Scanner(new FileInputStream("c:/abc"),"UTF-8")){
 // code
 } catch (IOException e){
 // handle exception
 }
}

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

阿里巴巴异常处理规约

常见面试题

ClassCastException(类转换异常)IndexOutOfBoundsException(数组越界)NullPointerException(空指针)ArrayStoreException(数据存储异常,操作数组时类型不一致)还有IO操作的BufferOverflowException异常

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。