java异常处理关键字,Java异常结构

  java异常处理关键字,Java异常结构

  00-1010 Java异常介绍Java异常架构1。可投掷2。错误3。例外4。检查和未检查异常检查和未检查异常Java异常关键字:Java异常处理抛出异常catch异常常见异常处理方式:直接抛出异常封装异常然后抛出Catch异常自定义异常Try-Catch-finally Try-with-resource摘要

  

目录

Java异常是Java提供的一致机制,用于识别和响应错误。

 

  Java异常机制可以将异常处理代码从正常的业务代码中分离出来,保证程序代码的优雅性,提高程序的健壮性。

  

Java异常简介

 

  

Java异常架构

Throwable是Java语言中所有错误和异常的超类。

 

  Throwable包含两个子类:Error和Exception,通常用来表示发生了异常情况。

  Throwable包含其线程创建时线程执行堆栈的快照,并提供printStackTrace()等接口来获取堆栈跟踪数据和其他信息。

  00-1010定义:错误类及其子类。程序中无法处理的错误表示在运行应用程序时发生了严重错误。

  特性:这种错误通常表明代码运行时JVM有问题。通常是虚拟的。

  错误(虚拟机错误运行错误),NoClassDefFoundError(类定义错误)

  等等。比如OutOfMemoryError:内存不足错误;StackOverflowError:堆栈溢出错误。当这样的错误发生时,JVM将终止线程。这些错误是未检测到的异常,非代码错误。因此,当出现这种错误时,应用程序不会

  这种错误应该处理。根据Java约定,我们不应该实现任何新的错误子类!

  00-1010程序本身可以捕捉和处理的异常。异常可以分为两类:运行时异常和编译时异常。

  00-1010定义:RuntimeException类及其子类,表示JVM在运行时可能出现的异常。

  特性:Java编译器不会检查它。也就是说,当程序中可能出现这种异常时,如果既没有‘通过throws语句抛出’,也没有‘被try-catch语句捕获’,就会被编译通过。比如NullPointerException空指针异常,

  ArrayIndexOutBoundException数组下标越界异常,ClassCastException类型转换异常,arithmetic exception算术异常。这种异常属于未检查的异常,一般是由程序的逻辑错误引起的。你可以在程序中选择捕捉并处理它或者不处理它。尽管Java编译器不检查运行时异常,但我们也可以通过抛出进行声明。

  ,你也可以通过试抓来抓。如果有运行时异常,您需要修改代码来避免它。比如除数为零,就需要通过代码来避免!

  RuntimeException异常会被Java虚拟机自动抛出并捕获(即使我们不写异常捕获语句,运行时也会抛出错误!),这类异常的出现,大多是因为代码本身存在问题,应该从逻辑上解决,改进。

  00-1010在:异常中定义异常,除了RuntimeException及其子类。

  特性: Java编译器会检查它。如果程序中出现这样的异常,比如

  ClassNotFoundException(未找到指定的类异常),IOException(IO流异常),要么通过throws声明并抛出,要么通过try-catch捕获,否则无法编译。在程序中,这种异常通常不会自定义,而是直接使用系统提供的异常类。我们必须在代码中手动添加一个catch语句来处理异常。

  

1. Throwable

Java中的Java异常可以分为检查异常和未检查异常。

 

  (未检查的异常).

  00-1010编译器要求必须处理异常。在运行的过程中,正确的程序往往容易出现和符合。

  预料中的异常情况。一旦出现这样的异常,就必须用某种方式来处理。除.之外

  除了RuntimeException及其子类,其他所有异常都是检查异常。编辑

  译器会检查此类异常,也就是说当编译器检查到应用中的某处可能会此类异常时,将会提示你处理本异常——要么使用try-catch捕获,要么使用方法签名中用 throws 关键字抛出,否则编译不通过。

  

 

  

非受检异常

编译器不会进行检查并且不要求必须处理的异常,也就说当程序中出现此类异常时,即使我们没有try-catch捕获它,也没有使用throws抛出该异常,编译也会正常通过。该类异常包括运行时异常(RuntimeException极其子类)和错误(Error)

 

  

 

  

Java异常关键字

• try – 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。

 

  • catch – 用于捕获异常。catch用来捕获try语句块中发生的异常。

  • finally – finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了 return或者throw等终止方法的语句,则就不会跳回执行,直接停止。

  • throw – 用于抛出异常。

  • throws – 用在方法签名中,用于声明该方法可能抛出的异常。

  

 

  

Java异常处理

Java 通过面向对象的方法进行异常处理,一旦方法抛出异常,系统自动根据该异常对象寻找合适异常处理器(Exception Handler)来处理该异常,把各种不同的异常进行分类,并提供了良好的接口。在 Java 中,每个异常都是一个对

 

  象,它是 Throwable 类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。Java 的异常处理是通过 5 个关键词来实现的:try、 catch、throw、throws 和 finally。

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

  

 

  

抛出异常

如果你觉得解决不了某些异常问题,且不需要调用者处理,那么你可以抛出异常。 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())!=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; } }

 

  

捕获异常

在一个 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 } }

 

  

自定义异常

习惯上,定义一个异常类应包含两个构造函数,一个无参构造函数和一个带有详

 

  细描述信息的构造函数(Throwable 的 toString 方法会打印这些详细信息,调试时很有用)

  

 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(); } } } }

调用该方法时,读取文件时若发生异常,代码会进入 catch 代码块,之后进入 finally 代码块;若读取文件时未发生异常,则会跳过 catch 代码块直接进入 finally 代码块。所以无论代码中是否发生异常,fianlly 中的代码都会执行。 若 catch 代码块中包含 return 语句,finally 中的代码还会执行吗?将以上代码 中的 catch 子句修改如下:

 

  

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

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

 

  

 readFile method catch block. readFile method finally block.

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

 

  

 

  

try-with-resource

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

 

  

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

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

 

  

 

  

总结

到此这篇关于Java异常架构和异常关键字的文章就介绍到这了,更多相关Java异常架构和异常关键字内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: