`

Java异常

 
阅读更多
任何一种程序设计语言设计的程序在运行时都有可能出现错误,例如除数为0,数组下标越界,要读写的文件不存在等等。
捕获错误最理想的是在编译期间,但有的错误只有在运行时才会发生。
对于这些错误,一般有两种解决方法:
遇到错误就终止程序的运行。
由程序员在编写程序时,就考虑到错误的检测、错误消息的提示,以及错误的处理。

异常:在Java语言中,将程序执行中发生的不正常情况称为“异常”。
Java中的异常用于处理非预期的情况,如文件没找到,网络错误,非法的参数
Java程序运行过程中所发生的异常事件可分为两类:
Error:  JVM系统内部错误、资源耗尽等严重情况
Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,例如:
空指针访问
试图读取不存在的文件
网络连接中断

Java异常举例(1):
public class Test8_1{
       public static void main(String[] args) {
      String friends[]={"lisa","bily","kessy"};
      for(int i=0;i<5;i++)  {
           System.out.println(friends[i]);   //friends[4]?
         }
System.out.println("\nthis is the end");
      }
}

程序Test8_1编译正确,运行结果:java Test8_1

lisa
bily
kessy
java.lang.ArrayIndexOutOfBoundsException
        at Test8_1.main(Test8_1.java:5)
Exception in thread "main"

Java异常举例(2)
public class NullRef{
   int i=1;
       public static void main(String[] args) {
NullRef t=new NullRef();
t=null;     
System.out.println(t.i);
      }
}

程序NullRef.java编译正确,运行结果:java NullRef

java.lang.NullPointerException
at NullRef.main(NullRef.java:6)
Exception in thread "main"

Java异常举例(3)
public class DivideZero{
   int x;
       public static void main(String[] args) {
int y;
DivideZero c=new DivideZero();
y=3/c.x;     
System.out.println(“program ends ok!”);
      }
}

程序DivideZero.java编译正确,运行结果:java DivideZero

java.lang.ArithmeticException: / by zero
at DivideZero.main(DivideZero.java:6)
Exception in thread "main"

常见异常:
RuntimeException
错误的类型转换
数组下标越界
空指针访问
IOExeption
从一个不存在的文件中读取数据
越过文件结尾继续读取
连接一个不存在的URL

异常处理机制:
在编写程序时,经常要在可能出现错误的地方加上检测的代码,如进行x/y运算时,要检测分母为0,数据为空,输入的不是数据而是字符等。过多的分支会导致程序的代码加长,可读性差。因此采用异常机制。

Java异常处理:
Java采用异常处理机制,将异常处理的程序代码集中在一起,与正常的程序代码分开,使得程序简洁,并易于维护。
Java提供的是异常处理的抓抛模型。
Java程序的执行过程中如出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。
如果一个方法内抛出异常,该异常会被抛到调用方法中。如果异常没有在调用方法中处理,它继续被抛给这个调用方法的调用者。这个过程将一直继续下去,直到异常被处理。这一过程称为捕获(catch)异常。
如果一个异常回到main()方法,并且main()也不处理,则程序运行终止。
程序员通常只能处理Exception,而对Error无能为力。

异常处理举例(1):
public class Test8_2{
      public static void main(String[] args)    {
     String friends[]={"lisa","bily","kessy"};
      try {
             for(int i=0;i<5;i++) {
              System.out.println(friends[i]);
                }
      }
catch(ArrayIndexOutOfBoundsException e)  {
                      System.out.println("index err");
      }
      System.out.println("\nthis is the end");
       }
}
程序Test8_2运行结果:
lisa
bily
kessy
index err

this is the end

异常处理举例(2):
public class DivideZero1{
   int x;
       public static void main(String[] args) {
int y;
DivideZero1 c=new DivideZero1();
try{
y=3/c.x;
}
catch(ArithmeticException e){     
System.out.println("divide by zero error!");
}
System.out.println("program ends ok!");
      }
}
程序DivideZero1运行结果:
divide by zero error!
program ends ok!

异常处理机制(3):
异常处理是通过try-catch-finally语句实现的。

try
{
...... //可能产生异常的代码
}
catch( ExceptionName1 e )
{
...... //当产生ExceptionName1型异常时的处置措施
}
catch( ExceptionName2 e )
{
...... //当产生ExceptionName2型异常时的处置措施

[ finally{
...... //无条件执行的语句
}  ]

捕获异常(1):
try
捕获异常的第一步是用try{…}语句块选定捕获异常的范围,将可能出现异常的代码放在try语句块中。
catch (Exceptiontype e)
在catch语句块中是对异常对象进行处理的代码。每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象。

如果明确知道产生的是何种异常,可以用该异常类作为catch的参数;也可以用其父类作为catch的参数。
可以用ArithmeticException类作为参数,也可以用RuntimeException类作为参数,或者用所有异常的父类Exception类作为参数。但不能是与ArithmeticException类无关的异常,如NullPointerException,那么,catch中的语句将不会执行。
捕获异常(2):
捕获异常的有关信息:
与其它对象一样,可以访问一个异常对象的成员变量或调用它的方法。
getMessage( ) 方法,用来得到有关异常事件的信息
printStackTrace( )用来跟踪异常事件发生时执行堆栈的内容。
捕获异常(3):
finally
捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。不论在try、catch代码块中是否发生了异常事件,finally块中的语句都会被执行。
finally语句是可选的

运行时异常和编译时异常:
前面但使用的异常都是RuntimeException类或是它的子类,这些类的异常的特点是:即使没有使用try和catch捕获,Java自己也能捕获,并且编译通过  ( 但运行时会发生异常使得程序运行终止 )。
如果抛出的异常是IOException类的异常,则必须捕获,否则编译错误。

IOException 异常处理举例(1):
import java.io.*;
public class Test8_3{
      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();
       }
}
IOException 异常处理举例(2):
import java.io.*;
public class Test8_3{
  public static void main(String[] args){
try{
FileInputStream in=new FileInputStream("myfile.txt");
int b;
b = in.read();
while(b!= -1)       {
System.out.print((char)b);
b = in.read();
}
in.close();
}catch (IOException e) {
        System.out.println(e);
}finally {
        System.out.println(" It’s ok!");
}
  }
}
声明抛出异常:
声明抛出异常是Java中处理异常的第二种方式
如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显式地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
在方法声明中用 throws 子句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。

声明抛出异常举例:
public void readFile(String file)  throws FileNotFoundException {
……
// 读文件的操作可能产生FileNotFoundException类型的异常
FileInputStream fis = new FileInputStream(file);
..……
     }
import java.io.*;
public class Test8_5{
public static void main(String[] args){
Test8_5 t = new Test8_5();
try{
t.readFile();
}catch(IOException e){   }
}
public void readFile()throws IOException {
FileInputStream in=new FileInputStream("myfile.txt");
int b;
b = in.read();
while(b!= -1)   {
System.out.print((char)b);
b = in.read();
}
in.close();
}
}

重写方法声明抛出异常的原则:
重写方法不能抛出比被重写方法范围更大的异常类型
public class A {
public void methodA() throws IOException {
      ……
}
    }
    public class B1 extends A {
public void methodA() throws FileNotFoundException {
      ……
}
    }
    public class B2 extends A {
public void methodA() throws Exception {   //error
        ……
    }
    }

人工抛出异常:
Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要人工创建并抛出
首先要生成异常类对象,然后通过throw语句实现抛出操作(提交给Java运行环境)。
IOException e =new IOException();
throw e;
可以抛出的异常必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误:
       throw new String("want to throw");

创建用户自定义异常类:
用户自定义异常类MyException,用于描述数据取值范围错误信息。用户自己的异常类必须继承现有的异常类。

class MyException extends Exception {
   private int idnumber;
public MyException(String message, int id) {
super(message);
this.idnumber = id;
}
public int getId() {
return idnumber;
}
}

public class Test8_6{
        public void regist(int num) throws MyException {
if (num < 0)
          throw new MyException(“人数为负值,不合理”,3);
else
          System.out.println("登记人数" + num );
        }
        public void manager() {
try {
           regist(100);
} catch (MyException e) {
           System.out.print("登记失败,出错种类"+e.getId());
}
System.out.print("本次登记操作结束");
       }
       public static void main(String args[]){
Test8_6 t = new Test8_6();
t.manager();
       }
}
分享到:
评论

相关推荐

    java异常处理习题

    Java 异常处理习题 Java 异常处理是 Java 编程语言中的一种重要机制,用于处理程序在运行时可能出现的错误或异常情况。下面是关于 Java 异常处理的习题和知识点总结: 一、Java 异常处理关键字 * Java 中用来抛出...

    java 异常详解,java异常分类,创建自己的异常

    Java 异常详解 Java 异常是指在程序运行中出现的违背指定正常流向的事件。异常可以分为两大类:-checked 异常和 unchecked 异常。Checked 异常必须在编译时捕捉并处理,而 unchecked 异常可以在编译时忽略,但是在...

    java异常机制小结

    Java 异常机制的基础知识包括异常的基础概念、异常的分类、异常的对象、异常的来源、异常的处理等几个方面。 一、Java 异常的基础知识 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以...

    高效的java异常处理框架高效的java异常处理框架高效的java异常处理框架

    本文将从 Java 异常的基本概念和语法开始,讲述 Java 异常处理的基本知识,分析 Java 异常体系结构,对比 Spring 的异常处理框架,阐述异常处理的基本原则,并提出了自己处理一个大型应用系统异常的思想,并通过设计...

    Java异常学习资料

    Java异常处理是Java编程语言中的一个关键特性,它允许程序员优雅地处理程序运行时出现的错误情况,确保程序的稳定性和可靠性。这份“Java异常学习资料”包含了丰富的资源,帮助你深入理解Java异常机制,提升代码质量...

    java异常处理练习题

    java异常练习题,北大青鸟学士后课后练习,主要是异常处理的小测验

    java异常 异常的概念 应用

    Java异常处理是编程中至关重要的一个环节,它关乎程序的健壮性和稳定性。在Java中,异常(Exception)被用来表示程序运行时发生的错误或不正常情况。异常并不等同于错误,它是程序设计的一部分,允许我们优雅地处理...

    java学习之Java异常.ppt

    Java异常处理是编程中至关重要的一个环节,它确保了程序在遇到错误情况时能够优雅地进行错误恢复或者至少提供有用的错误信息。Java异常是程序在运行时遇到的问题,例如数组越界、空指针异常、文件未找到等,这些问题...

    java 异常处理ppt

    Java异常处理是编程中至关重要的一个环节,它允许开发者优雅地处理程序运行时可能出现的错误,确保程序的健壮性和稳定性。Java中的异常处理机制基于一个独特的概念——异常(Exception),这是一种表示程序运行中...

    java异常体系结构

    Java异常体系结构是Java语言的重要组成部分,它负责处理程序执行过程中出现的错误情况。在Java中,异常由Throwable类及其子类构成。Throwable是所有异常的顶层父类,它有两个直接子类:Error和Exception。Error类...

    java 异常处理 代码实例

    Java异常处理是编程中至关重要的一个环节,它确保了程序在遇到错误时能够优雅地运行,而不是突然崩溃。本篇文章将深入探讨Java异常处理的概念、机制以及如何通过代码实例进行有效的异常管理。 Java异常处理的核心...

    Java异常处理体系

    这个主题,"Java异常处理体系",涉及到Java如何优雅地处理程序运行时的异常,确保程序的健壮性和稳定性。这篇博文链接(已提供但无法直接访问)可能详细解释了Java异常处理的基本概念、机制以及最佳实践。 Java异常...

    浅析JAVA异常处理机制.pdf

    ### 浅析JAVA异常处理机制 #### 一、Java异常处理机制概述 异常处理是Java语言中的一个重要机制,它能够确保程序在遇到不可预料的情况时仍能维持稳定运行。异常处理主要包括三个方面:捕获异常、控制程序流程以及...

    JAVA异常出错的教程,非常全面。

    Java异常处理是编程过程中的重要环节,它有助于增强程序的健壮性和稳定性。在这个全面的教程中,我们将深入探讨Java异常的基本概念、分类、处理机制以及最佳实践。 首先,Java异常是程序运行时发生的错误,它中断了...

    Java异常处理终结篇——如何进行Java异常处理设计 - 望远的个人页面 - 开源中国社区1

    Java异常处理设计是Java编程中一个至关重要的环节,它直接影响到程序的稳定性和可维护性。在Java中,异常处理是通过try-catch-finally语句块来实现的,主要涉及两大类异常:编译时异常(Checked Exception)和运行时...

    Java异常框架设计

    这篇博文“Java异常框架设计”可能探讨了如何有效地利用Java的异常处理机制来构建可靠的系统。在这个讨论中,我们将深入理解Java异常的基本概念、异常分类、以及如何通过良好的框架设计提升代码的可读性和可维护性。...

    Java异常分装实例

    在给定的“Java异常分装实例”中,我们可以学习如何创建自定义异常类、抛出和捕获异常,以及如何利用Java的异常层次结构。`exception_test`文件可能包含了一个或多个示例代码,用于演示这些概念。 首先,创建自定义...

Global site tag (gtag.js) - Google Analytics