异常
异常
icema1060 发表于7个月前
异常
  • 发表于 7个月前
  • 阅读 3
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

 

 

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

异常的继承体系

程序的异常: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("录入的是非法字符,请重新录入一个整数");
					}
				}
				
			}
		}
	}

 

标签: java
共有 人打赏支持
粉丝 0
博文 2
码字总数 2192
×
icema1060
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: