Java异常处理

  

什么是异常
  程序运行出错被称为出现异常(Eception),异常是程序运行过程中发生的事件,该事件可以中断程序指令的正常执行流程。

 

  eg:因数据元素下标越界而产生的运行时异常

   public class ExceptionDemo{
            public static void main(String[] args){
                      String[] friends={"Beila","Memei","Wangbo"};
                      for(int i=0;i<5;i++){
                           System.out.println(friends[i]);
                      }
                      System.out.println("This is the end!");
              }
       }

     

     运行结果:

  Beila
  Memei
  Wangbo
  Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
             at ExceptionDemo.main(ExceptionDemo.java:5)

  

 

  

异常处理

  

  程序运行出错时的应对措施,是软件开发中的一个重要方面。

  

  虽然对于外行人而言,计算机软件/程序应和精密的机械一样应该运行精准,但业内尤其是开发人员们都很清楚,程序运行难免出错,而出错后处理措施的优劣决定了软件的健壮性,进而影响到软件产品能否为用户接受和普及推广,甚至从一定程度上决定了软件产品的最终命运。

 

  计算机软件/程序在运行时可以会遇到下列问题:比如我们无法确保用户总是按照规定的格式输入数据、无法确保程序要读取的文件总是保存在预期的位置、无法确保连接的数据库服务器永远处于就绪状态、也无法彻底杜绝运行程序的计算机内存耗尽、系统程序崩溃等问题。

 

  作为一种面向对象的高级编程语言,Java在异常处理方拥有非常优秀的性能。

 

Java异常分类

Object

           ——Throwable

                                 —— Error   

                                                  —— VirtualMachineError     

                                                  —— LinkageError

                                                  ——...

                                 ——Exception

                                                  ——RuntimeException

                                                          ——IndexOfBoundsException

                                                          ——NullPointerException

                                                          ——ArithmeticException

                                                          ——...

                                                 ——IOException

                                                         ——FileNotFoundException

                                                         ——EOFException

                                                         ——...

说明:

  1、Throwable类是Java语言中所有异常类的父类

  2、Error是指系统内部错误、资源耗尽等严重情况,而Exception则是指编程错误或偶然的外在因素导致的一般性问题,例如对负数开平方根、空指针访问、试图读取一存在的文件以及网络中断等。

 

典型的Java异常 

 

一、Error类型 

 

  1、链接错误(LinkageError) 

  LinkageError 指的是程序链接错误。比如一个类中用到了另一个类,在编译前一个类之后,后一个类发生了不相容的改变时,使用前一个类则会出现链接错误,其中最常见的就是后一个类的.class文件被误删除而导致前一个类无法正常工作。

       /////////////// A.java

  public class A{
                 public void print(){
                System.out.println("A is called");
                }
       } 

    ////////////////////TestLinkageError.java

   public class TestLinkageError{
           public static void main(String[] args){
                   A a = new A();
                   a.print();
           }
  } 

  ///////////////////正常运行结果:A is called

////////////////////如果删除了A.java生成的字节码文件A.class,则会出现下面的结果:

Exception in thread "main" java.lang.NoClassDefFoundError: A
        at TestLinkageError.main(TestLinkageError.java:4)
Caused by: java.lang.ClassNotFoundException: A
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        ... 1 more

注:

NoClassDefFoundError类是LinkageError的子类,当JVM动态链接(即加载)所需Java类却找不到该的.class文件时,则出现此异常

 

  2、虚拟机错误(VirtualMachineError) 

  当Java虚拟机崩溃或用尽了它继续操作所需要的资源时,会抛出该错误,其中较有代表性的一种是StackOverflowError,当应用程序递归太深而导致栈溢出(即空间耗尽)时会出现的异常

   ////////////////TestVMError.java

      public class TestVMError{
             public static void main(String[]args){
                    TestVMError tvme = new TestVMError();
                    System.out.println("result="+tvme.f(100000));
             }

             public int f(int n){
             if(n<=1)
                   return 1;
              int k = n*f(n-1);
             return k;
            }
   }

   /////////////////////////运行结果如下/////////////////////// 

 Exception in thread "main" java.lang.StackOverflowError
        at TestVMError.f(TestVMError.java:7)
        at TestVMError.f(TestVMError.java:9)
        at TestVMError.f(TestVMError.java:9)
        at TestVMError.f(TestVMError.java:9)
        at TestVMError.f(TestVMError.java:9)

…………

 

小结:对于Error这些性质严重的异常,我们在编程过程中通过源代码对所发生的Error进行补救和恢复虽绝对不可能但也是极为困难,因此在开发中程序员对Error通常不做处理。而Exception可以认为是一种设计或实现问题,是程序员的责任。

 

二、Exception类型

 

  1、空指针异常(NullPointerException)

//////////////////NPException.java

class Person{
       public int age;
}

 

public class NPException{
       public static void main(String[] args){
       Person p = null;
       System.out.println("age="+p.age);
       } 
}

/////////////////////运行结果:

Exception in thread "main" java.lang.NullPointerException
        at NPException.main(NPException.java:8)

 

 

  2、输入输出异常(IOException)

  在程序中进行数据的输入/输出(I/0,Input/Output)操作时,经常会出现输入/输出异常(IOException),比如文件找不到,数据流已关闭等 。

/////////////////////////TestIOException.java

import java.io.*;
public class TestIOException{
      public static void main(String[] args){
      FileInputStream in = new FileInputStream("myfile.txt");
      int b;
      b = in.read();
      while(b!=-1){
            System.out.print((char)b);
            b = in.read();
      }
     in.close();
    }
}  

////////////////////////////运行结果:

TestIOException.java:4: 未报告的异常 java.io.FileNotFoundException;必须对其进行
捕捉或声明以便抛出
                FileInputStream in = new FileInputStream("myfile.txt");
                                     ^
TestIOException.java:6: 未报告的异常 java.io.IOException;必须对其进行捕捉或声明
以便抛出
                b = in.read();
                           ^
TestIOException.java:9: 未报告的异常 java.io.IOException;必须对其进行捕捉或声明
以便抛出
                    b = in.read();
                               ^
TestIOException.java:11: 未报告的异常 java.io.IOException;必须对其进行捕捉或声
明以便抛出
                 in.close();
                         ^
4 错误

 

 

Java异常处理机制

  Java的异常处理机制中仍体现了面向对象的思想—Java程序执行过程中如出现异常,系统会监测到并自动生成一个相应的异常类对象,然后再将它交给运行时系统,运行时系统再寻找相应的代码来处理这一异常。我们把生成异常对象并将之提交给运行时系统的过程称为抛出(throw)异常;运行时系统在方法的调用栈中查找,即从生成异常的方法开始进行回溯,直到找到异常的处理代码为止。这一个过程称为捕获(catch)异常;执行处理代码的过程也就是处理异常的过程。如果Java运行时系统找不到可以处理异常的代码,则运行时系统将终止,相就的Java程序也将退出。程序员通常对错误(Error)无能为力,因而一般只处理违例(Exception)。

 

你可能感兴趣的:(java异常处理)