Java异常处理实例教程_java

1、什么是异常?
首先,让我们来看看下图的例子:
在这个例子中,存在的错误码由除以0的结果。由于除以0而导致异常: ArithmeticException
HelloException.java

package com.yiibai.tutorial.exception;

public class HelloException {

  public static void main(String[] args) {

    System.out.println("Three");

    // This division no problem.
    int value = 10 / 2;

    System.out.println("Two");

    // This division no problem.
    value = 10 / 1;

    System.out.println("One");

    // This division has problem, divided by 0.
    // An error has occurred here.
    value = 10 / 0;

    // And the following code will not be executed.
    System.out.println("Let's go!");

  }

}

运行这个例子,得到的结果是:

可以看到控制台屏幕上的通知。错误通知是很清楚的,包括代码行的信息。
让我们通过下图中的流程看看下面的程序:

  • 程序从(1),(2)至(5)步骤正常运行。
  • 在步骤(6)程序除以0。
  • 程序跳转出 main 方法后,而(7)代码行还没有被执行。

我们将修改上述实施例的代码。

HelloCatchException.java

package com.yiibai.tutorial.exception;

public class HelloCatchException {

  public static void main(String[] args) {

    System.out.println("Three");

    // This division no problem.
    int value = 10 / 2;

    System.out.println("Two");

    // This division no problem.
    value = 10 / 1;

    System.out.println("One");

    try {
      // This division has problem, divided by 0.
      // An error has occurred here.
      value = 10 / 0;

      // And the following code will not be executed.
      System.out.println("Value =" + value);

    } catch (ArithmeticException e) {

      // The code in the catch block will be executed
      System.out.println("Error: " + e.getMessage());

      // The code in the catch block will be executed
      System.out.println("Ignore...");

    }

    // This code is executed
    System.out.println("Let's go!");

  }

}

运行示例结果:

Three

Two

One

Error: / by zero

Ignore...

Let's go!

我们将按以下实例图像的流程来解释下面的程序。

  • 步骤(1)至(5)是完全正常的。
  • 异常发生在步骤(6),除以0出现了问题。
  • 它立即跳到catch块执行命令,步骤(7)被跳过。
  • 步骤(8),(9)被执行。
  • 步骤(10)被执行。

2、 异常层次结构
这是Java异常的分层图的模型。

最高的类是:Throwable

两个直接子类是 Error 和 Exception。

在异常转移有一个RuntimeException子类,包括Java中的编译时未检查异常。检查并取消检查在编译时,在下一部分的实施示例中说明。

注意:您的类应该从两个分支:Error或Exception继承,而不是直接从Throwable继承。

当一个动态链接失败,或在虚拟机的一些其他的“硬”故障发生时,虚拟机引发这个错误。典型的Java程序不捕获错误,所以Java程序都不会抛出任何错误。大多数程序抛出并捕获从Exception类派生的对象。异常指示出现了一个问题,但是这些问题并不是严重系统性问题。你写的大多数程序将会抛出和捕获异常。

Exception类在Java包定义了许多子类。这些子类指明不同类型的可能会发生异常。 例如,NegativeArraySizeException表明程序试图创建一个大小为负的数组。

一个导演的子类在Java语言中的特殊含义: RuntimeException类表示Java虚拟机中发生(在运行期间)的异常。运行时异常的一个例子是NullYiibaierException异常,其中,当一种方法试图通过一个空引用来访问对象的成员时就会引发。 NullYiibaierException 可以在任何地方出现某个程序试图取消引用一个对象的引用。经常检查异常捕获的好处远远超过它的成本。

由于运行时异常是无所不在的,在试图捕获或指定所有的时间是徒劳的作法(不可读和不可维护的代码), 编译器允许运行时异常去未捕获和指定。
Java包定义几个RuntimeException类。您可以捕获这些异常,就像其他异常。但是并不需要一种方法来指定它抛出运行时异常。此外可以创建自己的RuntimeException子类。 运行时异常 - 下面讨论包含何时以及如何使用运行时异常进行了深入探讨。 3、使用try-catch处理异常

编写从Exception 继承的类。

AgeException.java

package com.yiibai.tutorial.exception.basic;

public class AgeException extends Exception {

  public AgeException(String message) {
    super(message);
  }

}
TooYoungException.java
package com.yiibai.tutorial.exception.basic;

public class TooYoungException extends AgeException {

 public TooYoungException(String message) {
   super(message);
 }

}

TooOldException.java

package com.yiibai.tutorial.exception.basic;

public class TooOldException extends AgeException {

 public TooOldException(String message) {
   super(message);
 }

}

以及AgeUtils类检查年龄的检查静态方法。
AgeUtils.java

package com.yiibai.tutorial.exception.basic;

public class AgeUtils {

  // This method checks the age.
  // If age is less than 18, the method will throw an exception TooYoungException
  // If age greater than 40, the method will throw an exception TooOldException
  public static void checkAge(int age) throws TooYoungException,
      TooOldException {
    if (age < 18) {

      // If age is less than 18, an exception will be thrown
      // This method ends here.
      throw new TooYoungException("Age " + age + " too young");
    } else if (age > 40) {

      // If age greater than 40, an exception will be thrown.
      // This method ends here.
      throw new TooOldException("Age " + age + " too old");
    }

    // If age is between 18-40.
    // This code will be execute.
    System.out.println("Age " + age + " OK!");
  }
}

检查异常和未经检查的异常:
AgeException是Exception,TooOldException的子类和TooYoungException2是 AgeException直接子类,所以它们是“Checked Exception”
在AgeUtils.checkAge(int)方法已经抛出异常,需要通过关键字“throws”,列出它们的方法声明。或者可以声明抛出更多的级别。
在使用 AgeUtils.checkAge(int) 位置也必须进行处理,以捕获异常,或继续抛出去。

"Checked exception" 是由 "Java Compiler"来检查。

有两个选择:

TryCatchDemo1.java

package com.yiibai.tutorial.exception.basic;

public class TryCatchDemo1 {

  public static void main(String[] args) {

    System.out.println("Start Recruiting ...");
    // Check age
    System.out.println("Check your Age");
    int age = 50;

    try {

      AgeUtils.checkAge(age);

      System.out.println("You pass!");

    } catch (TooYoungException e) {

      // Do something here ..
      System.out.println("You are too young, not pass!");
      System.out.println(e.getMessage());

    } catch (TooOldException e) {

      // Do something here ..
      System.out.println("You are too old, not pass!");
      System.out.println(e.getMessage());

    }

  }
}

在下面的例子中,我们将通过父类捕获异常(超Exception类)。
TryCatchDemo2.java

package com.yiibai.tutorial.exception.basic;

public class TryCatchDemo2 {

  public static void main(String[] args) {

    System.out.println("Start Recruiting ...");
    // Check age
    System.out.println("Check your Age");
    int age = 15;

    try {

      // Here can throw TooOldException or TooYoungException
      AgeUtils.checkAge(age);

      System.out.println("You pass!");

    } catch (AgeException e) {

      // If an exception occurs, type of AgeException
      // This catch block will be execute
      System.out.println("Your age invalid, you not pass");
      System.out.println(e.getMessage());

    }
  }
}

也可以组不同的异常在块中来处理,如果它们对逻辑程序处理是相同的方式。
TryCatchDemo3.java

package com.yiibai.tutorial.exception.basic;

public class TryCatchDemo3 {

  public static void main(String[] args) {

    System.out.println("Start Recruiting ...");
    // Check age
    System.out.println("Check your Age");
    int age = 15;

    try {

      // Here can throw TooOldException or TooYoungException
      AgeUtils.checkAge(age);

      System.out.println("You pass!");

    } catch (TooYoungException | TooOldException e) {
      // Catch multi exceptions in one block.

      System.out.println("Your age invalid, you not pass");
      System.out.println(e.getMessage());

    }
  }

}

4、 try-catch-finally
我们已习惯于通过 try-catch 块捕获错误。Try-catch-finally 来完全处理异常。

try {

  // Do something here

} catch (Exception1 e) {

  // Do something here

} catch (Exception2 e) {

  // Do something here

} finally {

  // Finally block is always executed
  // Do something here

}

TryCatchFinallyDemo.java

package com.yiibai.tutorial.exception.basic;

public class TryCatchFinallyDemo {

  public static void main(String[] args) {

    String text = "001234A2";

    int value = toInteger(text);

    System.out.println("Value= " + value);

  }

  public static int toInteger(String text) {
    try {

      System.out.println("Begin parse text: " + text);

      // An Exception can throw here (NumberFormatException).
      int value = Integer.parseInt(text);

      return value;

    } catch (NumberFormatException e) {

      // In the case of 'text' is not a number.
      // This catch block will be executed.
      System.out.println("Number format exception " + e.getMessage());

      // Returns 0 if NumberFormatException occurs
      return 0;

    } finally {

      System.out.println("End parse text: " + text);

    }
  }

}

这是程序的流程。 finally块无论什么情况下总会被执行。

5、 环绕异常

  • 我们需要一些类参与到这个例子:
  • Person: 模拟一个受试者招募到公司的信息:姓名,年龄,性别。
  • GenderException: 性别异常。
  • ValidateException: 异常评估求职者。
  • ValidateUtils: 静态方法类综合评价面试者。
  • 如果男性年龄在18-40之间的被认为是有效的。

Person.java

package com.yiibai.tutorial.exception.wrap;

public class Person {

  public static final String MALE = "male";
  public static final String FEMALE = "female";

  private String name;
  private String gender;
  private int age;

  public Person(String name, String gender, int age) {
    this.name = name;
    this.gender = gender;
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getGender() {
    return gender;
  }

  public void setGender(String gender) {
    this.gender = gender;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }
}

GenderException.java

package com.yiibai.tutorial.exception.wrap;

// Gender Exception.
public class GenderException extends Exception {

   public GenderException(String message) {
     super(message);
   }
}

ValidateException 类包有其他异常。
ValidateException.java

package com.yiibai.tutorial.exception.wrap;

public class ValidateException extends Exception {

  // Wrap an Exception
  public ValidateException(Exception e) {
    super(e);
  }

}

ValidateUtils.java

package com.yiibai.tutorial.exception.wrap;

import com.yiibai.tutorial.exception.basic.AgeUtils;

public class ValidateUtils {

  public static void checkPerson(Person person) throws ValidateException {
    try {

      // Check age.
      // Valid if between 18-40
      // This method can throw TooOldException, TooYoungException.
      AgeUtils.checkAge(person.getAge());

    } catch (Exception e) {

      // If not valid
      // Wrap this exception by ValidateException, and throw
      throw new ValidateException(e);

    }

    // If that person is Female, ie invalid.
    if (person.getGender().equals(Person.FEMALE)) {

      GenderException e = new GenderException("Do not accept women");
      throw new ValidateException(e);

    }
  }

}

WrapperExceptionDemo.java

package com.yiibai.tutorial.exception.wrap;

public class WrapperExceptionDemo {

  public static void main(String[] args) {

    // One participant recruitment.
    Person person = new Person("Marry", Person.FEMALE, 20);

    try {

      // Exceptions may occur here.
      ValidateUtils.checkPerson(person);

    } catch (ValidateException wrap) {

      // Get the real cause.
      // May be TooYoungException, TooOldException, GenderException
      Exception cause = (Exception) wrap.getCause();

      if (cause != null) {
        System.out.println("Not pass, cause: " + cause.getMessage());
      } else {
        System.out.println(wrap.getMessage());
      }

    }
  }

}

6、RuntimeException和子类 RuntimeException类及其子类都是“未检查的例外”。它不是由Java编译器在编译时进行检查。在某些情况下,你可以从这个分支继承编写自己的异常。

下面是属于RuntimeException分支一些类(当然,这还不是全部)。
一些处理这种类型异常的例子:

6.1- NullYiibaierException
这是最常见的异常,通常会导致错误在程序中。异常被抛出,当你调用方法或访问一个空对象的字段。
NullYiibaierExceptionDemo.java

package com.yiibai.tutorial.exception.runtime;

public class NullYiibaierExceptionDemo {

  // For example, here is a method that can return null string.
  public static String getString() {
    if (1 == 2) {
      return "1==2 !!";
    }
    return null;
  }

  public static void main(String[] args) {

    // This is an object that references not null.
    String text1 = "Hello exception";

    // Call the method retrieves the string length.
    int length = text1.length();

    System.out.println("Length text1 = " + length);

    // This is an object that references null.
    String text2 = getString();

    // Call the method retrieves the string length.
    // NullYiibaierException will occur here.
    // It is an exception occurs at runtime (type of RuntimeException)
    // Javac compiler does not force you to use a try-catch block to handle it
    length = text2.length();

    System.out.println("Finish!");
  }

}

运行示例的结果:

在现实中,像处理其他异常时,可以使用 try-catch 来捕获并处理这个异常。 然而,这是机械的,通常情况下,我们应该检查,以确保在使用它之前,对象不为空值。
您可以更正上面的代码,使其类似于下面的以避免空指针异常:

// This is a null object.
String text2 = getString();

// Check to make sure 'Text2' are not null.
// Instead of using try-catch.
if (text2 != null) {
 length = text2.length();
}

6.2- ArrayIndexOfBoundException
当您试图访问一个无效的索引的数组元素就会发生此异常。例如,一个数组有10个元素可以访问,但您访问的是索引为20的元素。
ArrayIndexOfBoundsExceptionDemo.java

package com.yiibai.tutorial.exception.runtime;

public class ArrayIndexOfBoundsExceptionDemo {

  public static void main(String[] args) {

    String[] strs = new String[] { "One", "Two", "Three" };

    // Access to the element has index 0.
    String str1 = strs[0];

    System.out.println("String at 0 = " + str1);

    // Access to the element has index 5.
    // ArrayIndexOfBoundsException occur here.
    String str2 = strs[5];

    System.out.println("String at 5 = " + str2);

  }

}

为了避免 ArrayIndexOfBoundsException,我们更多的应该是检查数组而不是使用try-catch。

if (strs.length > 5) {
  String str2 = strs[5];
  System.out.println("String at 5 = " + str2);
} else {
  System.out.println("No elements with index 5");
}

以上就是本文的全部内容,希望对大家的学习有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java异常
, 处理
java异常处理
java异常处理实例、java异常处理的实例、c 异常处理实例、java异常实例、java异常类实例,以便于您获取更多的相关知识。

时间: 2024-10-06 12:43:34

Java异常处理实例教程_java的相关文章

Java异常处理实例分析_java

本文实例讲述了Java异常处理的用法.分享给大家供大家参考.具体分析如下: Java的异常处理机制可以帮助我们避开或者处理程序可能发生的错误,从而使得程序在遇到一些可恢复的错误的时候不会意外终止,而是去处理这些错误,也使得我们在写程序的时候不必写大量的代码来检查错误情况,增强了代码的可读性和逻辑性.在Java中,异常代表一个错误的实体对象. 异常可分为两类:一类是严重错误,如硬件错误.内存不足等,它们对应着java.lang包下的Error类及其子类.通常这类错误程序自身是无法恢复的,需要中断程

JAVA反射机制实例教程_java

本文以实例形式详细讲述了Java的反射机制,是Java程序设计中重要的技巧.分享给大家供大家参考.具体分析如下: 首先,Reflection是Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性.例如,使用它能获得 Java 类中各成员的名称并显示出来. Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性.例如,Pascal.C 或者 C++ 中就没有办法在程序中获得函数

Java设计模式开发中使用观察者模式的实例教程_java

观察者模式是软件设计模式中的一种,使用也比较普遍,尤其是在GUI编程中.关于设计模式的文章,网络上写的都比较多,而且很多文章写的也不错,虽然说有一种重复早轮子的嫌疑,但此轮子非彼轮子,侧重点不同,思路也不同,讲述方式也不近相同.关键要素 主题: 主题是观察者观察的对象,一个主题必须具备下面三个特征. 持有监听的观察者的引用 支持增加和删除观察者 主题状态改变,通知观察者 观察者: 当主题发生变化,收到通知进行具体的处理是观察者必须具备的特征. 为什么要用这种模式 这里举一个例子来说明,牛奶送奶站

JAVA线程同步实例教程_java

线程是Java程序设计里非常重要的概念,本文就以实例形式对此加以详细解读.具体分析如下: 首先,线程加锁有什么用处呢?举个例子:比如你现在有30000块大洋在银行存着,现在你到银行取钱,当你输入密码完成后,已经输入取款金额,比如你输入的是20000,就是在银行给你拿钱这个时刻,你老婆也去银行取这笔钱,你老婆同样取20000,因为此时你的账上仍然是30000,所以银行同样的操作在你老婆那端又进行了一遍,这样当你们两个完成各自操作后,银行记录的你账上还应该有10000块存款,这样是不是很爽.解决这个

Java log4j详细教程_java

一:Log4j入门简介学习  Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程.最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码. 此外,通过Log4j其他语言接口,您可以在C.C++..Net.PL/SQL程序

浅谈java异常处理之空指针异常_java

听老师说,在以后的学习中大部分的异常都是空指针异常.所以抽点打游戏的时间来查询一下什么是空指针异常 一:空指针异常产生的主要原因如下: (1)当一个对象不存在时又调用其方法会产生异常obj.method() // obj对象不存在 (2)当访问或修改一个对象不存在的字段时会产生异常obj.method() // method方法不存在 (3)字符串变量未初始化: (4)接口类型的对象没有用具体的类初始化,比如: List lt:会报错 List lt = new ArrayList():则不会报

Java单例模式实例简述_java

本文实例讲述了Java的单例模式,是Java程序设计中非常重要的概念.分享给大家供大家参考.具体分析如下: 所谓单子模式就是在整个应用过程中只向外界提供唯一的一份实例,也就是说在应用时只有一个实例,这样也就不用反反复复的创建实例了.那么根据他的要求,看下面一个最简单的单例模式的代码: public class Singleton { private static Singleton single = new Singleton(); private Singleton(){ } public s

一道关于java异常处理的题目_java

1.建立exception包,编写TestException.java程序,主方法中有以下代码,确定其中可能出现的异常,进行捕获处理. public class YiChang { public static void main(String[] args){ for(int i=0;i<4;i++){ int k; switch(i){ case 0: int zero=0; try{ k=911/zero; }catch(ArithmeticException e){ System.out.

Java实现AOP面向切面编程的实例教程_java

介绍 众所周知,AOP(面向切面编程)是Spring框架的特色功能之一.通过设置横切关注点(cross cutting concerns),AOP提供了极高的扩展性.那AOP在Spring中是怎样运作的呢?当你只能使用core java,却需要AOP技术时,这个问题的解答变得极为关键.不仅如此,在高级技术岗位的面试中,此类问题也常作为考题出现.这不,我的朋友最近参加了一个面试,就被问到了这样一个棘手的问题--如何在不使用Spring及相关库,只用core Java的条件下实现AOP.因此,我将在