文档章节

异常

icema1060
 icema1060
发布于 2017/05/20 21:16
字数 1587
阅读 3
收藏 0
点赞 0
评论 0

 

 

异常:就是程序在运行时出现不正常情况。

异常的继承体系

程序的异常:Throwable
        严重问题:Error 我们不处理。这种问题一般都是很严重的,比如说内存溢出。
        问题:Exception
            编译期问题:不是RuntimeException的异常 必须进行处理的,因为你不处理,编译就不能通过。
            运行期问题:RuntimeException  这种问题我们也不处理,因为是你的问题,而且这个问题出现肯定是我们的代码不够严谨,需要修正代码的。

异常处理的两种方式

* A:异常处理的两种方式

* a:try…catch…finally

try...catch...finally的处理格式:
        try {
            可能出现问题的代码;
        }catch(异常名 变量) {
            针对问题的处理;
        }finally {
            释放资源;
        }
变形格式:
        try {
            可能出现问题的代码;
        }catch(异常名 变量) {
            针对问题的处理;
        }
注意:
        A:try里面的代码越少越好
        B:catch里面必须有内容,哪怕是给出一个简单的提示

 

A:一个异常
  B:二个异常的处理
        a:每一个写一个try...catch
        b:写一个try,多个catch
            try{
                ...
            }catch(异常类名 变量名) {
                ...
            }
            catch(异常类名 变量名) {
                ...
            }
            ...

            注意事项:
                1:能明确的尽量明确,不要用大的来处理。
                2:平级关系的异常谁前谁后无所谓,如果出现了子父关系,父必须在后面。

  注意:
        在try里面发现问题后,jvm会帮我们生成一个异常对象,然后把这个对象抛出,和catch里面的类进行匹配。
  如果该对象是某个类型的,就会执行该catch里面的处理信息。

        一旦有匹配的,就执行catch里面的处理,然后结束了try...catch
        继续执行后面的语句。

 

    一个异常
    public static void method1() {
        int a = 10;
        // int b = 2;
        int b = 0;

        try {
            System.out.println(a / b);
        } catch (ArithmeticException ae) {
            System.out.println("除数不能为0");
        }



      两个异常
    public static void method2() {
        int a = 10;
        int b = 0;
        try {
            System.out.println(a / b);
        } catch (ArithmeticException e) {
            System.out.println("除数不能为0");
        }

        int[] arr = { 1, 2, 3 };
        try {
            System.out.println(arr[3]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("你访问了不该的访问的索引");
        }

        System.out.println("over");
    }

    
       // 两个异常的处理
     public static void method3() {
        int a = 10;
        int b = 0;
        int[] arr = { 1, 2, 3 };

        try {
            System.out.println(arr[3]);
            System.out.println(a / b);
            
        } catch (ArithmeticException e) {
            System.out.println("除数不能为0");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("你访问了不该的访问的索引");
        }


     // 爷爷在最后
        try {
            System.out.println(a / b);
            System.out.println(arr[3]);
            System.out.println("这里出现了一个异常,你不太清楚是谁,该怎么办呢?");
        } catch (ArithmeticException e) {
            System.out.println("除数不能为0");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("你访问了不该的访问的索引");
        } catch (Exception e) {
            System.out.println("出问题了");
        }

 

  throws
  有些时候,我们是可以对异常进行处理的,但是又有些时候,我们根本就没有权限去处理某个异常。
  或者说,我处理不了,我就不处理了。
  为了解决出错问题,Java针对这种情况,就提供了另一种处理方案:抛出。

 格式:
        throws 异常类名
        注意:这个格式必须跟在方法的括号后面。
 public static void method2() throws ArithmeticException {
        int a = 10;
        int b = 0;
        System.out.println(a / b);
    }

public static void method() throws ParseException {
        String s = "2014-11-20";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d = sdf.parse(s);
        System.out.println(d);
    }


public static void method() {
        int a = 10;
        int b = 0;
        if (b == 0) {
            throw new ArithmeticException();
        } else {
            System.out.println(a / b);
        }
    }

* a:throws
		* 用在方法声明后面,跟的是异常类名                 throws Exception
		* 可以跟多个异常类名,用逗号隔开       throws Exception,ArithmeticException
		* 表示抛出异常,由该方法的调用者来处理
	* b:throw
		* 用在方法体内,跟的是异常对象名         throw new AgeOutOfBoundsException("年龄非法");
		* 只能抛出一个异常对象名
		* 表示抛出异常,由方法体内的语句处理

          return;	 //return在将死之前,会让finally完成未完成的遗愿
		} finally {

final,finally和finalize的区别
	  * final可以修饰类,方法,变量(常量)
	  * finally写在try catch语句用于释放资源(关闭数据库,关闭流)
	  * finalize()是一个方法,在垃圾回收的时候调用
自定义异常
要想你的类是一个异常类,就必须继承自Exception或者RuntimeException
两种方式:
  A:继承Exception
  B:继承RuntimeException

public class MyException extends Exception {
    public MyException() {                   //空参构造
    }

    public MyException(String message) {
        super(message);                     //有参构造
    }
}
// public class MyException extends RuntimeException {
//
// }


package cn.itcast_08;

public class Teacher {
    public void check(int score) throws MyException {
        if (score > 100 || score < 0) {
            throw new MyException("分数必须在0-100之间");
        } else {
            System.out.println("分数没有问题");
        }
    }

    // 针对MyException继承自RuntimeException
    // public void check(int score) {
    // if (score > 100 || score < 0) {
    // throw new MyException();
    // } else {
    // System.out.println("分数没有问题");
    // }
    // }
}

 异常注意事项

A:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏)
  B:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
  C:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
键盘录入一个int类型的整数,对其求二进制表现形式
	 * 如果录入的整数过大,给予提示,录入的整数过大请重新录入一个整数BigInteger
	 * 如果录入的是小数,给予提示,录入的是小数,请重新录入一个整数
	 * 如果录入的是其他字符,给予提示,录入的是非法字符,请重新录入一个整数

public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);		//创建键盘录入对象
		System.out.println("请输入一个整数");
		while(true) {
			String line = sc.nextLine();							//将键盘录入的结果存储在line中
			try {
				int num = Integer.parseInt(line);					//将数字字符串转成数字
				System.out.println(Integer.toBinaryString(num));	//将数字转换成二进制打印
				break;
			} catch (Exception e) {
				try {
					new BigInteger(line);		//如果能封装到BigInteger对象中说明是一个过大的整数
					System.out.println("录入的整数过大请重新录入一个整数:");
				} catch (Exception e2) {
					try {
						new BigDecimal(line);		//如果能封装到BigDecimal对象中说明是一个小数
						System.out.println("录入的是小数,请重新录入一个整数");
					} catch (Exception e3) {
						System.out.println("录入的是非法字符,请重新录入一个整数");
					}
				}
				
			}
		}
	}

 

© 著作权归作者所有

共有 人打赏支持
icema1060
粉丝 0
博文 2
码字总数 2192
作品 0

暂无相关文章

数据结构与算法之双向链表

一、双向链表 1.双向链表的结点结构 typedef struct DualNode{ ElemType data; struct DualNode *prior; // 前驱结点 struct DualNode *next; // 后继结点}DualNode, *DuL...

aibinxiao ⋅ 13分钟前 ⋅ 0

五大最核心的大数据技术

大数据技术有5个核心部分,数据采集、数据存储、数据清洗、数据挖掘、数据可视化。关于这5个部分,有哪些核心技术?这些技术有哪些潜在价值?看完今天的文章就知道了。 大数据学习群:7165810...

董黎明 ⋅ 14分钟前 ⋅ 0

PhpStorm 头部注释、类注释和函数注释的设置

首先,PhpStorm中文件、类、函数等注释的设置在:setting-》Editor-》FIle and Code Template-》Includes下设置即可,其中方法的默认是这样的: /**${PARAM_DOC}#if (${TYPE_HINT} != "v...

nsns ⋅ 14分钟前 ⋅ 0

spring.net AOP

http://www.springframework.net/doc-latest/reference/html/aop-quickstart.html https://www.cnblogs.com/wujy/archive/2013/04/06/3003120.html...

whoisliang ⋅ 19分钟前 ⋅ 0

【HAVENT原创】创建 Dockerfile 生成新的镜像,并发布到 DockerHub

注意:Win7 与 Win10 的版本存在差异,Win7 版本使用 Docker Quickstart Terminal 进入控制台,Win10下面直接用管理员权限打开控制台或者 PowerShell 即可;另外 Win7 下面只能访问 C盘,/ap...

HAVENT ⋅ 19分钟前 ⋅ 0

pom.xml出现web.xml is missing ...解决方案

提示信息应该能看懂。也就是缺少了web.xml文件,<failOnMissingWebXml>被设置成true了。 搜索了一下,Stack Overflow上的答案解决了问题,分享一下。 目前被顶次数最多的回答原文如下: This...

源哥L ⋅ 20分钟前 ⋅ 0

js时间戳与日期格式之间相互转换

1. 将时间戳转换成日期格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // 简单的一句代码 var date = new Date(时间戳); //获取一个时间对象 /** 1. 下面是获取时间日期的方法,需要什么样的格式自己...

Jack088 ⋅ 25分钟前 ⋅ 0

web添加log4j

添加xml配置log4j.properties # Global logging configuration---root日志设置#log4j.rootLogger=info,dailyRollingFile,stdoutlog4j.rootLogger=debug,stdout,dailyRollingFile---......

黄柳淞 ⋅ 26分钟前 ⋅ 0

如何解决生产环境宕机问题

写在前面:该篇宕机问题的排查难度远比上一篇(记一次解决线上OOM的心路历程)大的太多,上一篇中内存泄漏的问题是有迹可循的,本次的宕机在业务日志上没有任何征兆,另外本文有许多值得深挖...

寰宇01 ⋅ 38分钟前 ⋅ 0

Redis查漏补缺:最易错过的技术要点大扫盲

作者介绍 孤独烟,中国平安研发工程师,目前负责规则云平台架构设计以及需求研发工作。毕业后一直从事Java开发工作,在Web开发、架构设计上有多年的实战经验。在MySQL性能优化、JVM调优、分布...

kim_o ⋅ 39分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部