java异常:您处理的对吗?

编程中的异常表示程序执行中的异常情况。在其他地方可以更好地处理情况时使用。考虑下面的Java异常处理示例。...

编程中的异常表示程序执行过程中某个时刻的异常情况。当异常情况可以在其他地方更好地处理而不是在遇到异常情况的地方处理时,可以使用它。考虑以下示例:

handle-java-excepti***-featured

  • 打开配置文件失败可以在代码的更高层得到更好的处理,也许可以使用其他配置文件位置。
  • 访问数组边界之外的数组项表示程序错误。调试愉快!
  • XML解析错误应该引起用户的注意,以便可以更正XML文件。
  • 内存不足的程序(可能在处理大文件时)可以通过增加java进程可用的内存量来纠正。

在所有这些情况下(以及更多情况下),应该在生成异常的位置之外处理异常,以便可以解决根本原因。

异常类型

下图显示了Java异常层次结构的主要部分。基类是可丢弃的,它被分为异常和错误。类异常适用于程序相关的条件,应用程序可以捕获这些条件以试图挽救这种情况。另一方面,类错误用于指示Java运行时环境中应用程序不应捕获的严重错误。例如:OutOfMemoryError和StackOverflowerError。

Exception Hierarchy

异常有两种类型:checked和unchecked。已检查的异常必须由调用代码处理。此规则由java编译器强制执行。另一方面,未经检查的异常可以向上传播到调用链,而不必显式声明它。下面的例子将阐明。

检查型异常

以下方法尝试从文件创建FileReader。构造函数抛出一个选中的异常FileNotFoundException,该异常必须由调用代码处理或声明为抛出。

以下代码将不会编译,因为它既不编译也不编译。

private void loadFile(String filename){ FileReader in = new FileReader(filename);}

获取要编译的代码的一种方法是处理异常(见下文)。

private void loadFile(String filename){ try { FileReader in = new FileReader(filename)); { } catch(FileNotFoundException ex) { // handle exception here }}

如果调用方无法直接处理异常,则必须在方法签名中声明该异常。

private void loadFile(String filename) throws java.io.FileNotFoundException{ FileReader in = new FileReader(filename)); {}

非强制

未检查的异常是从RuntimeException子类化的异常,不需要像上面那样直接处理或声明。例如,下面的代码会导致NullPointerException,这是RuntimeException的一种类型。但是,由于NullPointerException是未检查的异常,因此代码编译时不会出错。

private void handleEvent(){ String name = null; if ( name.length() > 0 ) { }}

包装异常

鉴于上面关于检查和未检查异常的讨论,处理未检查异常似乎更容易,因为您不必自己声明或处理它们。考虑到这种方便性,有时将选中的异常包装到未选中的异常中可能很有用。

下面的代码示例演示了如何包装异常。方法\u 1()在其主体中抛出一个SQLException。要使代码正确编译,必须声明抛出异常。

private void method_1() throws SQLException { ... throw new SQLException;}

当从另一个方法(method_2())调用此方法时,该方法可以捕获SQLException并将其包装在未检查的异常中,因此它不必在其方法签名中声明异常。

private void method_2() { try { method_1(); } catch(java.sql.SQLException ex) { throw new RuntimeException(ex); }}

异常堆栈跟踪

异常堆栈跟踪指的是活动堆栈帧的数组,每个帧表示在抛出异常时由JVM捕获的方法调用。每个堆栈帧包括方法调用的位置,包括类名、方法名,可能还有java源文件名和文件中的行号。它有助于追溯导致错误的调用序列。

下面是一个典型的堆栈跟踪,从捕获异常对象时获取。

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 8, Size: 5 at java.util.ArrayList.rangeCheck(ArrayList.java:653) at java.util.ArrayList.get(ArrayList.java:429) at sample.sample1.main(sample1.java:24)

这里捕获的异常是IndexOutOfBoundsException。它包括有关错误的附加信息。堆栈跟踪包含3个堆栈帧,每个帧都包含位置信息,如图所示。

处理异常

可以通过在try-catch块中捕获异常并采取所需的任何纠正措施来处理异常。Exception对象提供了几种方法来提取有关导致异常的条件的信息。

下面的代码将错误消息记录到日志文件中。

private void loadConfig() { try { // invoke code which might generate an IOException } catch(java.io.IOException ex) { // handle exception here. May be log to a log file. log.warning(ex.getMessage()); }}

将异常包装到另一个异常中时,可以检索包装的异常:

Throwable cause = ex.getCause();log.warning("Underlying cause: " + cause.getMessage());

是否需要访问堆栈跟踪,或者提取导致堆栈跟踪的方法的名称?

StringBuilder **uf = new StringBuilder("Stack Trace: ");for (StackTraceElement el : ex.getStackTrace()) { **uf.append(el.getClassName() + "." + el.getMethodName()).append("");}log.warning(**uf.toString());

或者,记录异常并重试它?

try { ...} catch(java.io.IOException ex) { log.warning(ex.getMessage()); throw ex;}

Exception类提供了一个printStackTrace()方法,可以将堆栈跟踪打印到您自己的PrintStream(或PrintWriter)中。

try { ...} catch(java.io.IOException ex) { PrintStream out = ...; out.println(ex.getMessage()); ex.printStackTrace(out);}

您可以在一个try块中捕获多种类型的异常,并对每种类型的异常执行特定的处理。

try { // throws some excepti*** here} catch(java.io.IOException ex) { // IOException specific handling here} catch(java.sql.SQLException ex) { // SQLException specific handling here}

要捕获多个异常类型但使用相同的处理代码,可以按如下方式声明具有多个类型的catch块:

try { // throws some excepti*** here} catch(java.io.IOException | java.sql.SQLException ex) { // IOException and SQLException specific handling here} catch(SAXException ex) { // SAXException specific handling here}

用finally清理资源

在处理可能引发异常的代码时,必须对任何资源(如打开的文件、数据库连接等)执行适当的清理。资源清理应在finally块中执行。这样,块的正常退出和异常退出都会调用清除代码。

InputStream in = null;try { ... in = new FileInputStream(filename); ...} catch(java.io.IOException ex) { log.warning(ex.getMessage());} finally { // code here is executed on exiting the try block, // whether normally or due to an exception if ( in != null ) in.close();}

尝试使用资源块

Java1.7引入了try-with-resources结构,使资源清理更容易。看起来是这样的:

try( InputStream in = new FileInputStream(..) ) { // code which uses the InputStream.}

当代码退出块时(无论是干净的还是由于异常),InputStream变量将自动清除。

通过在块头中声明所有资源来清理多个资源。

try( InputStream in = new FileInputStream(..); Connection con = ...; ) { // code which uses the InputStream and the Connection.}

任何类实现AutoCloseable接口的对象都可以用这种方式清除。下面的类在close()方法中执行一些特定的清理。

public class MyClass implements AutoCloseable { public void close() { // cleanup code here }}

在try with resources块中使用此类的实例。

try( MyClass obj = new MyClass(..) ) { // code which uses the MyClass object.}

一些常见的异常

现在让我们来看看一些常见的异常。

  • IndexOutOfBoundsException(unchecked):表示被访问元素的索引超出数组、字符串等的界限。
  • SQLException(选中):由于数据库错误而引发。
  • IOException(选中):文件访问错误或与输入和输出有关的错误。
  • InterruptedException(选中):当线程执行被中断时抛出。
  • SAXException(选中):由于XML解析错误而引发。
  • NullPointerException(未选中):在需要对象的地方使用null。

总结

异常是Java中错误报告和管理的主要方法。正确使用异常可以提高代码质量并帮助解决生产中的问题。

你有什么与战争故事有关的例外吗?如果是,请在下面的评论部分告诉我们。

图片来源:Dmitry Nikolaev viaShutterstock.com网站

  • 发表于 2021-03-13 09:11
  • 阅读 ( 256 )
  • 分类:编程

你可能感兴趣的文章

扔(throw)和抛出java(throws in java)的区别

...常见的运行时错误是被零除并计算超出数组边界的元素。异常是由程序中的运行时错误引起的条件。当发生异常时,程序执行终止。如果程序员想继续执行剩余的代码,那么程序员可以捕获由错误条件引发的异常对象并显示错误...

  • 发布于 2020-09-21 19:02
  • 阅读 ( 353 )

选中的(checked)和java中的未检查异常(unchecked exception in java)的区别

关键区别——java中的检查异常与未检查异常 异常是运行时错误。有两种类型的异常称为检查异常和未检查异常。当发生选中的异常时,Java应用程序连接到外部资源,如文件、设备或数据库。这些异常由编译器检查。检查的...

  • 发布于 2020-10-19 08:38
  • 阅读 ( 278 )

最终决赛(final finally)和用java完成(finalize in java)的区别

...用于防止更改变量、避免方法重写和避免扩展类。最后是异常处理中的一个块,无论是否引发异常,它都将执行。finalize是一个方法,由垃圾回收器在完全销毁对象之前调用。这就是Java中final和finalize的关键区别。 目录 1. 概述和...

  • 发布于 2020-10-19 15:24
  • 阅读 ( 237 )

如何用java连接mysql数据库

... 代码可能抛出异常,因此如果您打算处理它(例如格式化GUI的错误消息),就可以捕获它。 ...

  • 发布于 2021-03-11 17:39
  • 阅读 ( 333 )

初学者必备的8个eclipse键盘快捷键

...开发。您还应该熟悉核心Java概念,例如如何在Java中使用异常。你也可以用Java玩得很开心---用Java和处理技术创造出惊人的网络摄像头效果! ...

  • 发布于 2021-03-11 23:36
  • 阅读 ( 334 )

用java编写多线程代码的4种方法

...其start()方法。这将启动线程执行并运行到完成(或在异常中终止)。 ...

  • 发布于 2021-03-14 04:48
  • 阅读 ( 176 )

如何正确处理java异常

作为一个编程新手,异常处理的概念可能很难让你理解。并不是说概念本身很难理解,而是术语可以让它看起来比实际更先进。而且它的功能非常强大,很容易被滥用。 ...

  • 发布于 2021-03-14 17:31
  • 阅读 ( 237 )

如何在windows10中打开jar文件

...ava内容”,将安全级别设置为“高”,并在必要时添加到异常网站列表。完成后,单击“确定”。 ...

  • 发布于 2021-03-20 05:20
  • 阅读 ( 341 )

5个免费的安全工具,你可能没听说过(但应该安装)

...装是最新的。Java有自己的安全问题,只有定期更新才能处理。 ...

  • 发布于 2021-03-25 08:12
  • 阅读 ( 185 )

如何用这些有用的应用程序和网站管理你的个人财务

...现身份盗窃企图,并轻松地将其关闭。如果它检测到任何异常情况,您将收到一条短信、电子邮件或电话警报,告诉您某个您不认识或不认识的人正在翻查您的帐户。 你需要一个预算 快速,简略,切中要害,你需要一个预算是...

  • 发布于 2021-04-10 09:29
  • 阅读 ( 160 )
青夕夜凉
青夕夜凉

0 篇文章

相关推荐