java学习笔记12--异常处理

1、异常处理概述

从一个读取两个整数并显示商的例子:

public static void main(String args[])
{
    Scanner input = new Scanner(System.in);
    System.out.print("Enter two integers: ");
    int number1 = input.nextInt();
    int number2 = input.nextInt();
    System.out.println(number1 + " / " + number2 + " is " + (number1 / number2));
 }

Enter two integers: 3 0

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

解决的一个简单的办法是添加一个if语句来测试第二个数字:

public class Main
{
    public static void main(String args[])
    {
        Scanner input = new Scanner(System.in);

        System.out.print("Enter two integers: ");
        int number1 = input.nextInt();
        int number2 = input.nextInt();
        if(number2 != 0)
            System.out.println(number1 + " / " + number2 + " is " + (number1 / number2));
        else
            System.out.println("Divisor cannot be zero ");
    }
}

为了演示异常处理的概念,包括如何创建、抛出、捕获以及处理异常,继续改写上面的程序如下:

public class Main
{
    public static void main(String args[])
    {
        Scanner input = new Scanner(System.in);

        System.out.print("Enter two integers: ");
        int number1 = input.nextInt();
        int number2 = input.nextInt();
        try {
            if(number2 == 0)
                throw new ArithmeticException("Divisor cannot be zero");
            System.out.println(number1 + " / " + number2 + " is " + (number1 / number2));
        }
        catch(ArithmeticException ex) {
            System.out.println("Exception: an integer " + "cannot be divided by zero ");
        }
        System.out.println("Execution continues ...");
    }
}

2、异常处理的优势

改用方法来计算商:

public class Main
{
    public static int quotient(int number1, int number2) {
        if(number2 == 0)
            throw new ArithmeticException("Divisor cannot be zero");
        return number1 / number2;
    }

    public static void main(String args[])
    {
        Scanner input = new Scanner(System.in);

        System.out.print("Enter two integers: ");
        int number1 = input.nextInt();
        int number2 = input.nextInt();
        try {
            int result = quotient(number1, number2);
            System.out.println(number1 + " / " + number2 + " is " + result);
        }
        catch(ArithmeticException ex) {
            System.out.println("Exception: an integer " + "cannot be divided by zero ");
        }
        System.out.println("Execution continues ...");
    }
}

异常处理的优势就是将检测错误从处理错误中分离出来。

3、异常类型

 4、关于异常处理的更多知识

java的异常处理模型基于三种操作:声明一个异常、抛出一个异常、捕获一个异常

声明异常

在方法中声明异常,就是在方法头中使用关键字throws,如下所示:

public void myMethod throws Exception1,Exception2,……,ExceptionN

抛出异常

检测一个错误的程序可以创建一个正确的异常类型的实例并抛出它

实例:

IllegalArgumentException ex = new IllegalArgumentException("Worng Argument");
throw ex;

或者直接:

throw new IllegalArgumentException("Worng Argument");

捕获异常

当抛出一个异常时,可以在try-catch中捕获和处理它:

try {
    statements;
} catch (exception1 ex1){
    handler for exception1;
} catch (exception1 ex2){
    handler for exception2;
}
……
catch (exception1 exN){
    handler for exceptionN;
}
    

从异常中获取信息

可以采用Throwable类中的方法获取异常的信息

public class test {
    public static void main(String[] args) {
        try {
            System.out.println(sum(new int[]{1,2,3,4,5}));
        } catch(Exception ex) {
            ex.printStackTrace();
            System.out.println(ex.getMessage());
            System.out.println(ex.toString());
            System.out.println("Trace Info Obtained from getBackTrace");
            StackTraceElement[] traceElements = ex.getStackTrace();
            for(int i = 0; i < traceElements.length; i++) {
                System.out.print("monthod " + traceElements[i].getMethodName());
                System.out.println("(" + traceElements[i].getClassName());
                System.out.println(traceElements[i].getLineNumber() + ")");
            }
        }
    }

    private static int sum(int[] list) {
        int sum = 0;
        for(int i = 0; i <= list.length; i++) {
            sum += list[i];
        }
        return sum;
    }
}

finally语句

无论异常是否出现,都希望执行某些代码,这时可以采取finally子句:

public class test {
    public static void main(String[] args) {
        PrintWriter output = null;
        try {
            output = new PrintWriter("wu.txt");
            output.println("wlecome tio java");
        } catch(IOException ex) {
            ex.printStackTrace();
        } finally {
            if(output != null)
                output.close();
        }
        System.out.println("End of the program");
    }
}
时间: 2024-12-31 01:00:04

java学习笔记12--异常处理的相关文章

API Demos 2.3 学习笔记 (12)-- Views-&amp;gt;Rating Bar

更多精彩内容,请点击阅读:<API Demos 2.3 学习笔记> RatingBar是基于SeekBar和ProgressBar的扩展,用星型来显示等级评定.用户可以通过触屏点击或者轨迹球左右移动来进行星型等级评定.RatingBar有三种风格:ratingBarStyle 默认风格  ratingBarStyleSmall 小风格 ratingBarStyleIndicator 大风格 其中,默认风格的RatingBar是我们通常使用的可以交互的,而后面两种不能进行进行交互,只能作为指示牌

Java学习笔记

笔记 本笔记是在看浙大翁恺老师的视频教学时所做,希望对Java初学者有帮助! 一.Java基础1.正确认识Java(1)Java是一种有生产力的OOP语言,C++能做的Java都能做(2)Java与网络关系不大,更不是用来做网页的(3)Java是UNIX世界的产物,具有UNIX的思想(4)Java在国外广泛的被用来做各种应用2.Java历史(1)Brithday:May 23,1995(2)1991:Set-Top box:Jame Gosling(3)1994:OAK and FirstPer

java 学习笔记

笔记 JAVA的多线程 一.线程基本概念 将1个程序转换成多个独立运行的子任务.每个子任务都叫做一个线程. "进程"是指一种"自包容"的运行程序.有自己的地址空间.一个进程可以容纳多个同时执行的线程. 事实上,多线程最主要的一个用途就构建1个"反应灵敏"的用户界面. 二.线程的使用 1. 创建一个线程 最简单的方法就是从Thread类继承这个类,包含了创建和运行线程所需的一切东西. Thread最重要的是run方法,继承类必须对之进行重载,使其按

java学习笔记13--反射机制与动态代理

Java的反射机制 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制. Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类. 在运行时构造任意一个类的对象. 在运行时判断任意一个类所具有的成员变量和方法. 在运行时调用任意一个对象的方法 Reflection 是Java被视为动态(或准动态)

Java学习笔记,适用于零基础的小伙伴

1. 成员变量与局部变量的区别     1.作用域:         成员变量的作用域是整个类中都可以访问:         局部变量是的作用域是定义它的{}内, {}中的语句执行完它就被回收:     2.初始值:         局部变量使用前必须手动赋值, 系统不会赋默认值:成员变量系统会赋默认初始值.     3.所在内存区域:         局部变量在方法运行的栈内存里,在栈里,会自动释放:         成员变量在对象里,对象在堆里,成员变量也在堆里,不使用的对象会被垃圾回收机制

java 学习笔记(入门篇)_java的安装与配置_java

  学习Java已经很长时间了,但是总感觉基础不是很好,有时候遇到一些平时不常见的问题就会无从下手,也从侧面显现了自己的一些问题.所以,打算写Java的随手笔记来巩固基础,加强学习.今天是第一篇,主要是java的安装,配置,也就是常说的Hello world.   一.下载   进入Oracle的官网,下载Java的jdk,   二.安装   安装就简单了,只需要下一步就可以,路径可以根据需要自己选择.   三.配置    安装完jdk后还不能来编译程序,因为还需要配置java 的jdk.进入的

java学习笔记7--Polymorphism

笔记 Polymorphism 多态(polymorphism)也被称为动态绑定『dynamic binding』.后绑定『late binding』或运行时绑定『run-time bingding』.它的意思是要在程序运行的时候,根据对象的类型来决定该绑定哪个方法.多态性是继数据抽象和继承之后的,面向对象的编程语言的第三个基本特性. 绑定(binding): 将方法的调用连到方法本身前绑定(early binding): 当绑定发生在程序运行之前时(就是由编译器或连接器负责)后绑定(late

java学习笔记--Hiding implementation

笔记 hiding the implementation这句话讲得很好:In any relationship, it's important to have boundaries that are respected by all parties involved. 不管你们是什么关系,有一个彼此尊重的界限是很重要的. #----CLASSPATH(要大写,最好加上当前目录.):java 解释器会在以下两个地方查找.class文件: 1. jdk所在的标准目录 2. 路径 = 以CLASSPA

JavaScript高级程序设计(第3版)学习笔记12 js正则表达式_基础知识

需要指出的是,这里只是总结了正则表达式的常用的且比较简单的语法,而不是全部语法,在我看来,掌握了这些常用语法,已经足够应对日常应用了.正则表达式不只是应用在ECMAScript中,在JAVA..Net.Unix等也有相应应用,这篇文章则是以ECMAScript中的正则表达式为基础总结的. 一.正则表达式基础 1.普通字符:字母.数字.下划线.汉字以及所有没有特殊意义的字符,如ABC123.在匹配时,匹配与之相同的字符. 2.特殊字符:(需要时,使用反斜杠"\"进行转义) 字符 含义 字

java学习笔记6--类的继承、Object类

1.类的继承 一种由已有的类创建新类的机制,是面向对象程序设计的基石之一.通过继承,可以根据已有类来定义新类,新类拥有已有类的所有功能 Java只支持单继承,每个子类只能有一个直接父类,父类是所有子类的公共属性及方法的集合,子类则是父类的特殊化,继承机制可以提高程序的抽象程度,提高代码的可重用性 基类(base class),也称超类(superclass),是被直接或间接继承的类 派生类(derived-class),也称子类 (subclass),继承其他类而得到的类,继承所有祖先的状态和行