课堂动手动脑验证以及自定义异常类实现对异常处理——java异常类

异常(exception):发生在程序执行期间,表明出现了一个非法运行的情况。许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象。例如:数组越界和被0除。

代码验证:

package test;

import javax.swing.*;

class AboutException {
   public static void main(String[] a)
   {
      int i=1, j=0, k;
    try
    {

        k = i/j;    // Causes division-by-zero exception
        //throw new Exception("Hello.Exception!");
    }

    catch ( ArithmeticException e)
    {
        System.out.println("被0除.  "+ e.getMessage());
    }

    catch (Exception e)
    {
        if (e instanceof ArithmeticException)
            System.out.println("被0除");
        else
        {
            System.out.println(e.getMessage());

        }
    }

    finally
     {
             JOptionPane.showConfirmDialog(null,"OK");
     }

  }
}

输出结果:

当java程序中出现多try catch的情况时,一定要注意程序执行的先后顺序。

多try catch的java异常处理代码一

package test;

public class CatchWho {
    public static void main(String[] args) {
        try {
                try {
                    throw new ArrayIndexOutOfBoundsException();
                }
                catch(ArrayIndexOutOfBoundsException e) {
                       System.out.println(  "ArrayIndexOutOfBoundsException" +  "/内层try-catch");
                }

            throw new ArithmeticException();
        }
        catch(ArithmeticException e) {
            System.out.println("发生ArithmeticException");
        }
        catch(ArrayIndexOutOfBoundsException e) {
           System.out.println(  "ArrayIndexOutOfBoundsException" + "/外层try-catch");
        }
    }
}

程序运行结果:

多try catch的java异常处理代码二

package test;

public class CatchWho2 {
    public static void main(String[] args) {
        try {
                try {
                    throw new ArrayIndexOutOfBoundsException();
                }
                catch(ArithmeticException e) {
                    System.out.println( "ArrayIndexOutOfBoundsException" + "/内层try-catch");
                }
            throw new ArithmeticException();
        }
        catch(ArithmeticException e) {
            System.out.println("发生ArithmeticException");
        }
        catch(ArrayIndexOutOfBoundsException e) {
            System.out.println( "ArrayIndexOutOfBoundsException" + "/外层try-catch");
        }
    }
}

程序运行结果:

当有多个try catch finally嵌套 时,要特别注意finally的执行时机。特别注意:当有多层嵌套的finally时,异常在不同的层次抛出,在不同的位置抛出,可能会导致不同的finally语句的执行顺序。再者,我们一般认为finally语句中的句子一定会被执行,这里的一定是相对而言的,并不是绝对的。例如以下程序代码的运行:

package test;

public class SystemExitAndFinally {

    public static void main(String[] args)
    {

        try{

            System.out.println("in main");

            throw new Exception("Exception is thrown in main");

                    //System.exit(0);

        }

        catch(Exception e)

            {

            System.out.println(e.getMessage());

            System.exit(0);

        }

        finally

        {

            System.out.println("in finally");

        }

    }

}

运行结果:

在这段java代码中finally语句块并没有执行。

通过过异常的学习,自己尝试了自定义了一个异常类来处理异常,源码如下:

package classtest;

import java.util.Scanner;

class Myexception extends Exception {
    public Myexception(String message) {
        super(message);
    }
}

public class Mytest {

    public static void main(String[] args) throws Exception{
        // TODO Auto-generated method stub
        try{
            function();
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
            System.out.println("main()函数运行时出现异常");
        }
        finally {
            System.out.println("main()函数运行完毕");
        }
    }

    public static int judge(String str) {
        int c = 0;
        String regex = "[0-9]+";
        String regex1="[-][0-9]+";
        boolean d = str.matches(regex);
        boolean e = str.matches(regex1);
        if (d == false) {
            c = 1;
            if (e == true) {
                c = 0;
            }
        }
        return c;
    }

    public static void function() {
        try {
            System.out.println("请输入一个正整数:");
            Scanner input = new Scanner(System.in);
            String a = input.next();
            int temp = judge(a);
            if (temp == 1) {
                throw new Myexception("不能输入非法字符");
            } else {
                int num = Integer.parseInt(a);
                if (num < 0)
                    throw new Myexception("输入不能为负数");
                else if (num == 0) {
                    throw new Myexception("正整数不包括0");
                }
            }

        } catch (Myexception f) {
            System.out.println(f.getMessage());
        } catch (Exception e) {
            System.out.println(e.getMessage());
            System.out.println("function()函数运行时出现异常");
        }
       finally {
           System.out.println("function()函数已运行完毕,请指示下一步动作");
       }

    }
}

原文地址:https://www.cnblogs.com/weixiao1717/p/11780111.html

时间: 2024-10-13 02:02:39

课堂动手动脑验证以及自定义异常类实现对异常处理——java异常类的相关文章

java异常类的妙用

以往在使用异常时,只是知道通过异常类的构造方法设置一些出错信息,此外最多就是把引起该异常的原因通过Throwable类的子类一同设置进去.今天在分析springSecurity3.0.5的框架时,看到AuthenticationException这个异常类(用在验证时)的源码,发现这个异常类除了上述常见的用法外,还把Authentication(验证信息)的做为属性放到了异常类中,当验证出错时AuthenticationException抛出时,Authentication(验证信息)一同被抛出

Java异常类及处理

异常概述:运行时发生的不正常情况 在java中用类的形式对不正常的情况进行了描述和封装对象. 描述不正常的类,称之为异常类. 异常就是java通过面向对象的思想将问题封装成了对象,用异常类对其进行描述. 不同的问题用不同的类进行具体的描述,比如角标越界,空指针等. 异常体系两大类: 无论是error,还是Exception,问题发生就应该可以抛出,让调用者知道并处理,该体系的特点就在于Throwable及其所有子类都具备可抛性. Throwable: ① 一般不可处理的.Error 特点:是由J

面试准备(三) Java 异常类层次结构

在Java中,异常分为受检查的异常,与运行时异常. 两者都在异常类层次结构中.这类容易出选择题 考试你是否掌握了异常类并清楚哪些异常类必须捕获 下面的图展示了Java异常类的继承关系. 图1 粉红色的是受检查的异常(checked exceptions),其必须被 try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.受检查的异常必须在编译时被捕捉处理,命名为 CHecked Exception 是因为Java编译器要进行检查,Java虚拟机也要进行检查,以确保这个规则得到

Java异常类

原文出自:http://blog.csdn.net/hguisu/article/details/6155636  在原文的基础上做优化和编辑. 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常.因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件.当条件生成时,错误将引发异常. Java异常类层次结构图:

python的异常处理及异常类定义

python的异常处理语法和大多数语言相似: try: try块的语句... except exceptiontype1 as var:#使用as语句获得本次捕获到的异常的实例var except块语句... except exceptiontype2 as var: except块语句... except: except块语句... else: else块语句... finally: finally块语句... 执行的流程分两类: 1.try->若有异常发生->except->fina

每天一点儿java---继承exception类来实现自己的异常类

package prac_1; /** * <p>Title: 捕获异常和实现自己的异常类</p> * <p>Description: 通过继承Exception类来实现自己的异常类.并使用try-catch来捕获这个异常.</p> * <p>Copyright: Copyright (c) 2014</p> * <p>Filename: </p> * @author 王海涛 * @version 0.1 */

Java课堂动手动脑-截图集锦

课堂实践性问题 没有数据类型,名称与类名相同,没有返回值 类本身有自定义的构造方法,调用时应有参数,这时系统不再使用默认构造方法 类字段初始化顺序 1.执行类成员定义时指定的默认值或累的初始化块,执行哪一个看哪一个排在前面. 2.执行类的构造函数 动手动脑问题(类之间继承,创建子类对象导致父类初始化块的执行) 静态初始化执行顺序 1.静态初始化块只执行一次 2.创建子类的对象时,父类的初始化块也会执行 静态方法访问实例成员变量如下:

10月14日课堂动手动脑

动手动脑 一.为何下面的代码无法编译 public class D1 { public static void main(String[] args) { //int a=1; Foo f=new Foo(); //System.out.println(f.value); } } class Foo{ int value; public Foo(int i) { value=i; } } 原因是当类中有自己定义的构造函数时,初始化时要传参进行初始化. 如果类提供了一个自定义的构造方法,将导致系统

java课堂 动手动脑3

(1) 该函数没有赋初值再就是如果类提供一个自定义的构造方法,将导致系统不在提供默认的构造方法. (2) public class test { public static void main(String[] args) { // TODO Auto-generated method stub InitializeBlockClass obj=new InitializeBlockClass(); System.out.println(obj.field); obj=new Initializ