黑马程序员——学习日记3——异常机制

------- android培训java培训、期待与您交流! ----------


        对于异常机制,个人感觉并不是很难,用起来也比较简单。但是,它却是要经常使用的东西,开发工程中,绝大多数工作都是围绕用户的误操作进行的,所以异常机制的使用频率肯定会很高,应该熟练。
        异常:是在运行时期发生的不正常情况。在java中用类的形式对不正常情况进行了描述和封装对象,描述不正常的情况的类,就称为异常类。   

        不同的问题用不同的类进行具体的描述( 比如角标越界、空指针等等)。问题很多,意味着描述的类也很多,将其共性进行向上抽取,形成了异常体系。
        最终问题(不正常情况)就分成了两大类:
        throwable:无论是error,还是异常、问题,问题发生就应该可以抛出,让调用者知道并处理。 该体系的特点就在于Throwable及其所有的子类都具有可抛性。
       
         可抛性到底指的是什么呢?怎么体现可抛性呢?
                  其实是通过两个关键字来体现的: throws throw ,凡是可以被这两个关键字所操作的类和对象都具备可抛性。
                   |--1,一般不可处理的。Error     特点:是由jvm抛出的严重性的问题。
                       这种问题发生一般不针对性处理。直接修改程序
                    |--2,可以处理的。Exception   特点:子类的后缀名都是用其父类名作为后缀,阅读性很强。
        自定义异常:
        负数角标这种异常在java中并没有定义过,按照java异常的创建思想,面向对象,将负数角标进行自定义描述,并封装成对象。这种自定义的问题描述成为自定义异常。

        注意:如果让一个类称为异常类,必须要继承异常体系,因为只有称为异常体系的子类才有资格具备可抛性。 才可以被两个关键字所操作,throws throw
异常的分类:
        1,编译时被检测异常:只要是Exception和其子类都是,除了特殊子类RuntimeException体系。
        这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应的处理方式。
        这样的问题都可以针对性的处理。
        2,编译时不检测异常(运行时异常):就是Exception中的RuntimeException和其子类。
        这种问题的发生,无法让功能继续,运算无法进行,更多是因为调用者的原因导致的而或者引发了内部状态的改变导致的。
        这种问题一般不处理,直接编译通过,在运行时,让调用者调用时的程序强制停止,让调用者对代码进行修正。所以自定义异常时,要么继承Exception,要么继承RuntimeException。
        throws  和throw的区别:
                1,throws使用在函数上。
                       throw使用在函数内。
                2,throws抛出的是异常类,可以抛出多个,用逗号隔开。
                       throw抛出的是异常对象。
        异常的捕捉处理:

        异常处理的捕捉形式:这是可以对异常进行针对性处理的方式。
                具体格式:
                try
                {
                          需要被检测异常的代码。
                 }
                catch(异常类  变量)    该变量用于接收发生的异常对象
                {
                          处理异常的代码。
                 }
                finally
                {
                         一定会被执行的代码。
                 }
        异常处理的原则:
        1,函数内容如果抛出需要检测的异常,那么函数上必须要声明。否则必须在函数内用trycatch捕捉,否则编译失败。
        2,如果调用到了声明异常的函数,要么trycatch要么throws,否则编译失败。
        3,什么时候catch,什么时候throws  呢?
              功能内容可以解决,用catch。
              解决不了,用throws告诉调用者,由调用者解决  。
        4,一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性的处理。内部又几个需要检测的异常,就抛几个异常,抛出几个,就catch几个。

        异常的注意事项:
        1,子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类。
        2,如果父类抛出多个异常,那么子类只能抛出父类异常的子集。
              简单说:子类覆盖父类只能抛出父类的异常或者子类或者子集。
        注意:如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛,就只能try 。

      
package com.itheima;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 1.从键盘接受一个数字,列出该数字的中文表示格式, 例如:键盘输入123,打印出一二三; 键盘输入3103,打印出三一零三。
 *
 * @author ACER
 *
 *         思路: 1.通过键盘输入串数字; 2.对键盘输入的字符进行检查,判断是否是一串数字; 3.通过查表法获得数字对应的汉字; 4.输出结果。
 */

public class Test1 {
    public static void main(String[] args) throws IOException {
        // 字符表
        String[] str = new String[] { "零", "一", "二", "三", "四", "五", "六", "七",
                "八", "九" };
        System.out.println("请输入一串数字:");

        // 定义一个字符串,接受键盘输入的字符
        String s = null;

        // 判断输入的是否为数字,将输入的字符转换为long,如果转换失败,通过catch捕获异常重新输入

        while (true) {
            try {
                BufferedReader bufr = new BufferedReader(new InputStreamReader(
                        System.in));
                s = bufr.readLine();

                // 将输入的字符转换为long
                long number = Integer.parseInt(s);

                // 如果输入的是负数,重新输入
                if (number < 0) {
                    System.out.println("请不要输入负数!请重新输入:");
                    return;
                }
                break;
            } catch (NumberFormatException e) {
                System.out.println("输入的不是数字!请重新输入:");
            }
            finally{            
                //这里可以做些处理,不论try中代码是否顺利执行,这里的代码都会执行
                System.out.println("这里可以做些处理,不论try中代码是否顺利执行,这里的代码都会执行");
            }
        }

        // 将字符串转换为char数组,并转换为int数组
        char[] c = s.toCharArray();
        int[] a = new int[c.length];
        for (int x = 0; x < c.length; x++) {
            a[x] = c[x] - '0';
        }
        System.out.print("输出结果:");
        for (int x : a) {
            System.out.print(str[x]);
        }
    }
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值