Java中的常客异常(一)

Java的基本理念是“结构不佳的代码不能运行”!!!!!

大成若缺,其用不弊。

大盈若冲,其用不穷。

在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因素,这就是所谓的智者千虑必有一失。同样的道理,计算机的世界也是不完美的,异常情况随时都会发生,我们所需要做的就是避免那些能够避免的异常,处理那些不能避免的异常。这里我将记录如何利用异常还程序一个“完美世界”。

一、为什么要使用异常

首先我们可以明确一点就是异常的处理机制可以确保我们程序的健壮性,提高系统可用率。虽然我们不是特别喜欢看到它,但是我们不能不承认它的地位,作用。有异常就说明程序存在问题,有助于我们及时改正。在我们的程序设计当中,任何时候任何地方因为任何原因都有可能会出现异常,在没有异常机制的时候我们是这样处理的:通过函数的返回值来判断是否发生了异常(这个返回值通常是已经约定好了的),调用该函数的程序负责检查并且分析返回值。虽然可以解决异常问题,但是这样做存在几个缺陷:

1、 容易混淆。如果约定返回值为-11111时表示出现异常,那么当程序最后的计算结果真的为-1111呢?

2、 代码可读性差。将异常处理代码和程序代码混淆在一起将会降低代码的可读性。

3、 由调用函数来分析异常,这要求程序员对库函数有很深的了解。

在IO中提供的异常处理机制是提供代码健壮的强有力的方式。使用异常机制它能够降低错误处理代码的复杂度,如果不使用异常,那么就必须检查特定的错误,并在程序中的许多地方去处理它,而如果使用异常,那就不必在方法调用处进行检查,因为异常机制将保证能够捕获这个错误,并且,只需在一个地方处理错误,即所谓的异常处理程序中。这种方式不仅节约代码,而且把“概述在正常执行过程中做什么事”的代码和“出了问题怎么办”的代码相分离。总之,与以前的错误处理方法相比,异常机制使代码的阅读、编写和调试工作更加井井有条。(摘自《Think
in java 》)。

二、基本定义

在《Think in java》中是这样定义异常的:异常情形是指阻止当前方法或者作用域继续执行的问题。在这里一定要明确一点:异常代码某种程度的错误,尽管Java有异常处理机制,但是我们不能以“正常”的眼光来看待异常,异常处理机制的原因就是告诉你:这里可能会或者已经产生了错误,您的程序出现了不正常的情况,可能会导致程序失败!

那么什么时候才会出现异常呢?只有在你当前的环境下程序无法正常运行下去,也就是说程序已经无法来正确解决问题了,这时它就会从当前环境中跳出,并抛出异常。抛出异常后,它首先会做几件事。首先,它会使用new创建一个异常对象,然后在产生异常的位置终止程序,并且从当前环境中弹出对异常对象的引用,这时。异常处理机制就会接管程序,并开始寻找一个恰当的地方来继续执行程序,这个恰当的地方就是异常处理程序,它的任务就是将程序从错误状态恢复,以使程序要么换一种方法执行,要么继续执行下去。

总的来说异常处理机制就是当程序发生异常时,它强制终止程序运行,记录异常信息并将这些信息反馈给我们,由我们来确定是否处理异常。

三、异常体系

java为我们提供了非常完美的异常处理机制,使得我们可以更加专心于我们的业务逻辑,在使用异常之前我们需要了解它的体系结构:

从上面这幅图可以看出,Throwable是java语言中所有错误和异常的超类(万物即可抛)。它有两个子类:Error、Exception。

其中Error为错误,是程序无法处理的,如OutOfMemoryError、ThreadDeath等,出现这种情况你唯一能做的就是听之任之,交由JVM来处理,不过JVM在大多数情况下会选择终止线程。

Exception是程序可以处理的异常。它又分为两种CheckedException(受捡异常),一种是UncheckedException(不受检异常)。其中CheckException发生在编译阶段,必须要使用try…catch(或者throws)否则编译不通过。而UncheckedException发生在运行期,具有不确定性,主要是由于程序的逻辑问题所引起的,难以排查,我们一般都需要纵观全局才能够发现这类的异常错误,所以在程序设计中我们需要认真考虑,好好写代码,尽量处理异常,即使产生了异常,也能尽量保证程序朝着有利方向发展。

所以:对于可恢复的条件使用被检查的异常(CheckedException),对于程序错误(言外之意不可恢复,大错已经酿成)使用运行时异常(RuntimeException)。

       java的异常类实在是太多了,产生的原因也千变万化,所以下篇博文我将会整理,统计java中经常出现的异常,望各位关注!!

四、异常使用

在网上看了这样一个搞笑的话:世界上最真情的相依,是你在try我在catch。无论你发神马脾气,我都默默承受,静静处理。

在异常中try快包含着可能出现异常的代码块,catch块捕获异常后对异常进行处理。先看如下实例:

[java] view
plain
 copy

print?

  1. public class ExceptionTest {
  2. public static void main(String[] args) {
  3. String file = "D:\\exceptionTest.txt";
  4. FileReader reader;
  5. try {
  6. reader = new FileReader(file);
  7. Scanner in = new Scanner(reader);
  8. String string = in.next();
  9. System.out.println(string + "不知道我有幸能够执行到不.....");
  10. } catch (FileNotFoundException e) {
  11. e.printStackTrace();
  12. System.out.println("对不起,你执行不到...");
  13. }
  14. finally{
  15. System.out.println("finally 在执行...");
  16. }
  17. }
  18. }

这是段非常简单的程序,用于读取D盘目录下的exceptionText.txt文件,同时读取其中的内容、输出。首先D盘没有该文件,运行程序结果如下:

[java] view
plain
 copy

print?

  1. java.io.FileNotFoundException: D:\exceptionTest.txt (系统找不到指定的文件。)
  2. at java.io.FileInputStream.open(Native Method)
  3. at java.io.FileInputStream.<init>(FileInputStream.java:106)
  4. at java.io.FileInputStream.<init>(FileInputStream.java:66)
  5. at java.io.FileReader.<init>(FileReader.java:41)
  6. at com.test9.ExceptionTest.main(ExceptionTest.java:19)
  7. 对不起,你执行不到...
  8. finally 在执行...

从这个结果我们可以看出这些:

1、当程序遇到异常时会终止程序的运行(即后面的代码不在执行),控制权交由异常处理机制处理。

2、catch捕捉异常后,执行里面的函数。

当我们在D盘目录下新建一个exceptionTest.txt文件后,运行程序结果如下:

[java] view
plain
 copy

print?

  1. 1111不知道我有幸能够执行到不.....
  2. finally 在执行...

11111是该文件中的内容。从这个运行结果可以得出这个结果:不论程序是否发生异常,finally代码块总是会执行。所以finally一般用来关闭资源。

在这里我们在看如下程序:

[java] view
plain
 copy

print?

  1. public class ExceptionTest {
  2. public static void main(String[] args) {
  3. int[] a = {1,2,3,4};
  4. System.out.println(a[4]);
  5. System.out.println("我执行了吗???");
  6. }
  7. }

程序运行结果:

[java] view
plain
 copy

print?

  1. Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
  2. at com.test9.ExceptionTest.main(ExceptionTest.java:14)

各位请注意这个异常信息和上面的异常信息错误,为了看得更加清楚,我将他们列在一起:

[java] view
plain
 copy

print?

  1. java.io.FileNotFoundException: D:\exceptionTest.txt (系统找不到指定的文件。)
  2. Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4

在这里我们发现两个异常之间存在如下区别:第二个异常信息多了Exception in thread "main",这显示了出现异常信息的位置。在这里可以得到如下结论:若程序中显示的声明了某个异常,则抛出异常时不会显示出处,若程序中没有显示的声明某个异常,当抛出异常时,系统会显示异常的出处。

由于这篇博文会比较长,所以分两篇来介绍。下篇博文主要介绍Java异常的自定义异常、异常链、异常的使用误区、使用异常注意地方以及try…catch、throw、throws。望各位看客关注!!!!

时间: 2024-10-23 01:39:23

Java中的常客异常(一)的相关文章

Java中出现的异常类型

Java中出现的异常类型     失踪的格式参数异常 java.util.MissingFormatArgumentException异常 错误提示信息: java.util.MissingFormatArgumentException:Format specifier 's' 原因:字符串格式化提供的值的数量少于字符串格式符(%s)的数量 参数:  format - 在格式字符串的语法中描述的格式字符串  args - 格式字符串中的格式说明符引用的参数.如果参数多于格式说明符,则忽略额外的参

java中常见的异常类

1. java.lang.nullpointerexception   这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等.对数组操作中出现空指针,很多情况下是一些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的初始化混淆起来了.数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空

java中常见的异常

Java中的异常分为2种: 1:JVM异常,这类异常或错误由JVM抛出.具有排他性或最具逻辑性 2:程序异常,这些异常由应用程序或API程序员显示地抛出.   JVM抛出的异常 1:NullPointerException 空指针 public class Test { static String s; public static void main(String[] args) { System.out.println(s.length()); } } 解析:使用一个当前值为null的引用变量

java中常见的异常(转)

1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等.对数组操作中出现空指针,很多情况下是一些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的初始化混淆起来了.数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,

Java中的常见异常

Java中异常的三种处理方式:面试笔试也常被问 try-catch-finally throw和throws  

Java中的ExceptionInInitializerError异常及解决方法

当在静态初始化块中出现了异常的时候,JVM会抛出 java.lang.ExceptionInInitializerError异常.如果你了解Java中的静态变量,你会知道它们是在类加载的时候进行初始化的.如果在这个静态变量初始化的过程中出现了异常,那么就会抛出 java.lang.ExceptionInInitializerError异常.任何异常都可能会引发这种情况,比如说,java.lang.ArrayIndexOutOfBound或者java.lang.NullPointerExcepti

java中常见的异常种类

Java常见的异常种类 ------------------------------------------------------------------------------- java Exception: 1.Error 2.Runtime Exception运行时异常 3.Exception 4.throw用户自定义异常 异常类分为两个大的类型:Error类代表了编译和系统的错误,不允许被捕获:Exception代表了java库方法所激发的异常.Exception类还包括Runtim

Java中常见的异常类型

异常大体分为编译异常和运行异常两类,如果用软件开发(如Eclipse)编译异常在写代码时得到提醒,而运行异常需要在运行时才能得到提示. 下面介绍几种常见的异常类型,便于在出错时对程序进行查错: (1)Exception    各种异常的根类 如果你不知道将发生的异常集体属于哪,而可以肯定种这个地方会出现异常时,可以把异常类型定义为Exception. (2)ArithmeticException     算数运算错误异常 这个异常是在算数运算时经常遇到的,常见的情况是除数为0时抛出的异常. (3

java中的一般异常与运行时异常

Java提供了两类主要的异常:runtime exception和checked exception.checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常.对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch.所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常. 但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理.当出现这样的异常时,总是由虚拟机接管.比如:我们从来没有人去处理过Nul