java学习之异常三

目录

一、throws

一、基本说明

 二、使用细节

二、自定义异常

一、 基本概念

​编辑二、自定义异常的步骤

三、实例

 四、练习

 三、throw和throws的区别

四、本章作业 

第一道

 第二题

 第三题

第四题


一、throws

一、基本说明

 

package com.hspedu.throws_;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * @author GQQ
 * @version 1.0
 */
public class Throws01 {
    public static void main(String[] args) throws FileNotFoundException{
        f1();
    }
    public static void f1() throws FileNotFoundException,NullPointerException,ClassCastException {
       //创建了一个文件流对象
        //1.这里的异常是一个FileNotFoundException 编译异常,必须要明确的处理
        //2.使用前面讲过的try-catch-finally
        //3.使用 throws ,抛出异常,让调用f1方法的调用者处理
        //4.throws可以抛出方法中产生的异常类型:FileNotFoundException,也可以抛出其父类Exception
        //5.throws 关键字后也可以是 异常列表,即可以抛出多个异常
        FileInputStream fis = new FileInputStream("d:\\aa.jpg");




    }
}

 二、使用细节

 

package com.hspedu.throws_;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * @author GQQ
 * @version 1.0
 */
public class ThrowsDetail {
    public static void main(String[] args) {
        f2();//运行异常,默认throws处理
    }

    public static void f2() {
        //1.对于编译异常, 程序中必须处理, 比如 try-catch 或者 throws
        //2.对于运行时异常,程序中如果没有处理, 默认就是 throws 的方式处理

        int n1 = 10;
        int n2 = 0;
        double res = n1 / n2;
    }

    public static void f1() throws FileNotFoundException {
        //在f1()中调用方法f3(), f3()抛出一个编译异常: FileNotFoundException
        //编译异常必须要显式的处理,两种:t-c-f/throws
        f3();
    }

    public static void f3() throws FileNotFoundException {//编译异常
        FileInputStream fis = new FileInputStream("d:\\aa.jpg");
    }

    public static void f4() {
        //1.在此处调用f5()是OK的
        //2.f5()抛出的是一个运行异常
        //3.运行异常有默认处理机制,并不要求显式处理
        f5();
    }

    public static void f5() throws ArithmeticException {//运行异常

    }
}

class Father {
    public void method() throws RuntimeException {

    }
}

class Son extends Father {
    //3.子类重写父类的方法时,抛出的异常类型要么和父类一致,或者是父类异常类型的子类型
    //子类抛出的异常类型 范围 <= 父类
    //4. 在 throws 过程中, 如果有方法 try-catch , 就相当于处理异常, 就可以不必 throws
    @Override
    //如果是throws Exception就会报错
    //如果是throws FileNotFoundException 也会报错因为这是编译异常,跟运行异常之间不存在继承关系
    public void method() throws NullPointerException {//NullPointerException是RuntimeException的子类

    }
}

二、自定义异常

一、 基本概念


二、自定义异常的步骤

三、实例

package com.hspedu.customexception_;

/**
 * @author GQQ
 * @version 1.0
 */
public class CustomException {
    public static void main(String[] args)/*throws Exception*/{
        int age = 124;
        if(!(age >= 18 && age <= 120)){
            //可以通过构造器,设置打印出的信息
            throw new AgeException("年龄需要在18-120之间");
        }
        System.out.println("年龄范围正确...");//如果只是扔出异常而没有catch,则不会执行此语句
    }
}
//自定义一个异常
//一般情况下,自定义异常是继承自RuntimeException
//2.即把自定义异常做成运行时异常,好处是: 我们可以使用默认的处理机制
//3.如果写成是extends Exception,则是编译异常,
// 4.就必须在main方法中显式的抛出异常 throws Exception,或者使用t-c-f
class AgeException extends RuntimeException{
    public AgeException(String message) {
        super(message);
    }
}

 

 四、练习

 

package com.hspedu.customexception_;

/**
 * @author GQQ
 * @version 1.0
 */
public class CustomExceptionExercise {
    public static void main(String[] args) {
        try{
            ReturnExceptionDemo.methodA();
        } catch (Exception e){
            System.out.println(e.getMessage());
        }
        ReturnExceptionDemo.methodB();
    }


}
class ReturnExceptionDemo{
    static void methodA(){
        try {
            System.out.println("进入方法A");
            throw new RuntimeException("制造异常");
        }finally {
            System.out.println("用A方法的finally");
        }
    }
    static void methodB(){
        try {
            System.out.println("进入方法B");
            return;
        } finally{
            System.out.println("调用B方法的finally");
        }

    }
}

考察知识点:如果抛出了异常throw new RuntimeException("制造异常");,或者是出现了return语句就表示要结束此方法,剩余的代码不会再执行,但是如果有finally,那么finally中的代码必须执行,所以此时就会优先执行finally中的代码

 三、throw和throws的区别

四、本章作业 

第一道

 

我的代码

package com.hspedu.homework;

/**
 * @author GQQ
 * @version 1.0
 */
public class EcmDef {
    public static void main(String[] args) {
        /*
        编写应用程序EcmDef.java,接收命令行的两个参数(整数),计算两数相除。
        计算两个数相除,要求使用方法 cal(int n1,int n2)
        对数据格式不正确、缺少命令行参数、除0 进行异常处理
        数据格式不正确:NumberFormatException
        缺少命令行参数:ArrayIndexOutOfBoundsException
        除0:ArithmeticException
         */
        try {
            //如果用这个循环条件的话,即使传入了3个参数也不会报错
            for (int i = 0; i < args.length; i++) {
                int n1 = Integer.parseInt(args[0]);
                int n2 = Integer.parseInt(args[1]);
                cal(n1,n2);
            }
        } catch (NumberFormatException e) {
           throw new NumberFormatException("数据格式不正确");
        }catch (ArrayIndexOutOfBoundsException e) {
            throw new ArrayIndexOutOfBoundsException("缺少命令行参数");
        }catch (ArithmeticException e) {
            throw new ArithmeticException("被除数为0,运算异常");
        }
        System.out.println("程序继续执行...");
    }
    public static void cal(int n1 ,int n2){
        System.out.println("res = " + n1 / n2);
    }
}

代码问题:

 在命令行输入参数时,数组args的数据就已经传入到main方法中了,所以

就算没有发生异常,此循环也会被执行  参数的个数   次,此时循环次数就是3

for (int i = 0; i < args.length; i++) {
    int n1 = Integer.parseInt(args[0]);
    int n2 = Integer.parseInt(args[1]);
    cal(n1,n2);
}

运行结果

 并且此代码只在   命令行参数只有一个的时候 会抛出异常,不能判断命令行参数 为多个或者0个的情况

正确代码

package com.hspedu.homework;

/**
 * @author GQQ
 * @version 1.0
 */
public class EcmDef02 {
    public static void main(String[] args) {
        //首先对传入的参数个数进行判断
        try {
            if(args.length != 2){
                throw new ArrayIndexOutOfBoundsException("参数个数不正确");//扔出异常后需要用try-catch来捕获异常
            }
            int n1 = Integer.parseInt(args[0]);
            int n2 = Integer.parseInt(args[1]);
            cal(n1,n2);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println(e.getMessage());;
        } catch (NumberFormatException e) {
            System.out.println("数字类型转换异常");
        }catch (ArithmeticException e) {
            System.out.println("数学运算异常(除数为0)");
        }
        System.out.println("继续执行程序...");
    }
    public static void cal(int n1, int n2){
        System.out.println("res=" + n1 / n2);
    }
}

 

 

 第二题

package com.hspedu.homework;

/**
 * @author GQQ
 * @version 1.0
 */
public class HomeWork02 {
    public static void main(String[] args) {
        //String[] args是一个空数组,里面没有存储任何数据
        System.out.println(args.length);

        //由于args是一个空数组,这里会发生ArrayIndexOutOfBoundsException
        //发生异常后,下面的代码都不会执行
        if(args[4].equals("john")){
            System.out.println("BB");
        }else{
            System.out.println("AA");
        }
        Object o= args[2];//ok,String是Object的子类
        Integer i =(Integer)o;//ClassCastException,Integer和String没有继承关系
        //String i =(String)o;//OK


    }

}

 第三题

package com.hspedu.homework;

/**
 * @author GQQ
 * @version 1.0
 */
public class HomeWork03 {
    public static void main(String[] args) {
        try {
            func();
            System.out.println("A");//在try中如果抛出了异常,剩余代码块就不执行,所以此处不输出
        } catch (Exception e) {
            System.out.println("C");//捕获异常并打印 即第三步 C
        }
        System.out.println("D");//由于异常已经被捕获,所以可以正常输出 D,结果就是BCD
    }

    public static void func() {//静态方法
        try {
            //第一步是抛出异常,但是一旦抛出异常,就不会执行剩余代码
            //但是finally中的代码必须执行,所以先输出B,再抛出异常
            throw new RuntimeException();//第二步
        } finally {
            System.out.println("B");//第一步 B
        }
    }

}

第四题

package com.hspedu.homework;

/**
 * @author GQQ
 * @version 1.0
 */
public class HomeWork04 {
    public static void main(String[] args) {
        try{
            showExce();//调用此方法后抛出一个异常,剩余代码不再执行
            System.out.println("A");
        }catch(Exception e){
            System.out.println("B");
        } finally{
            System.out.println("C");
        }
        System.out.println("D");

    }
    public static void showExce() throws Exception{
        throw new Exception();//抛出异常
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值