JAVA语言基础语法——异常中的常见方法及抛出异常等练习

文章详细介绍了Java中的异常处理机制,包括Throwable类的成员方法如e.printStackTrace(),以及如何使用throws声明异常和throw手动抛出异常。此外,还展示了如何在方法中捕获并处理异常,以及创建自定义异常类来增强错误信息的表达。在给定的代码示例中,演示了如何处理键盘输入的数据验证异常,如姓名长度和年龄范围的检查。
摘要由CSDN通过智能技术生成
    • Throwable的成员方法

定义在最顶级Throwable类中

a.实例如下:

e.printStackTrace(); 将异常的所有信息红色的字体打印在控制台,不会结束虚拟机,仅仅只是打印的操作。

    • 抛出处理

throws

注意:写在方法定义处,表示声明一个异常,告诉调用者,使用本方法可能会有哪些异常

编译时异常:必须要写

运行时异常:可以不写

throw

注意:写在方法内,结束方法,手动抛出异常对象,交给调用者,方法中下面的代码不在执行了

a.示例如下

package YiChang.YiChangZuoYong;

public class ExceptionDemo7 {
    public static void main(String[] args) {
        //需求:定义一个方法求数组的最大值
        int [] arr = null;
        int max = 0;
        try {
            max = getMax(arr);
        } catch (NullPointerException e) {
            System.out.println("空指针异常");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("索引越界异常");
        }
        System.out.println(max);
    }
    public static int getMax(int[] arr) throws NullPointerException,ArrayIndexOutOfBoundsException{
        if (arr == null) {
            //手动创建一个异常对象,并把这个异常交给方法的调用者处理
            //此时方法就会结束,下面的代码不会在执行了
            throw  new NullPointerException();
        }
        if (arr.length == 0) {
            //手动创建一个异常对象,并把这个异常交给方法的调用者处理
            //此时方法就会结束,下面的代码不会在执行了
            throw new ArrayIndexOutOfBoundsException();
        }
        System.out.println("看看我执行了吗?");
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        return max;
    }
}

小结:抛出throw throws

在方法中,出现了异常。

方法就没有继续运行下去的意义了,采取抛出处理。

让该方法结束运行,并告诉调用者出现了问题。

    • 练习

a.键盘录入数据

需求:

键盘录入自己心仪的女朋友姓名和年龄。

姓名的长度在3-10之间,

年龄的范围为18-40岁,

超出这个范围是异常数据不能赋值,需要重新录入,一直录到正确为止。

提示:

需要考虑用户在键盘录入时的所有情况。

比如:录入年龄时超出范围,录入年龄时录入了 abc 等情况。

抛出 捕获

告诉调用者出错了 不让程序停止

b.代码如下:

GirlFrend类:
package YiChang.YiChangZuoYong;

public class GirlFriend {
    private  String name;
    private  int age;


    public GirlFriend() {
    }

    public GirlFriend(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        int len = name.length();
        if (len < 3 || len > 10) {
            throw new RuntimeException();
        }
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) throws RuntimeException{
        if (age <18 || age > 40 ) {
            throw  new RuntimeException();
        }
        this.age = age;
    }

    public String toString() {
        return "GirlFriend{name = " + name + ", age = " + age + "}";
    }
}

Test类:

package YiChang.YiChangZuoYong;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {

        //创建键盘录入的对象
        Scanner sc = new Scanner(System.in);
        //创建女朋友的对象
        GirlFriend gf = new GirlFriend();
        //3.接收女朋友的姓名
        while (true) {
            try {
                System.out.println("请输入你心仪女朋友的名字:");
                String name = sc.nextLine();
                gf.setName(name);

                //接收女朋友的年龄
                System.out.println("请输入你心仪女朋友的年龄:");
                String ageStr = sc.nextLine();//不能用nextInt 只能接收整数,但输入abc则会报错
                int age = Integer.parseInt(ageStr);//做一个类型转换
                gf.setAge(age);
                //如果所有的数据都正确,那么跳出循环
                break;
            } catch (NumberFormatException e) {
                System.out.println("年龄的格式有误,请输入数字");
                continue;
            } catch (RuntimeException e) {
                System.out.println("姓名的长度或者年龄的范围有误");
                continue;
            }
        }
        //5.打印
        System.out.println(gf);
    }
}

运行结果如下

4.自定义异常(为了让控制台的报错信息更加的见名之意)

a.定义异常类

b.写继承关系

c.空参构造

d.带参构造

实例如下:

NameFormatException异常类:

package YiChang.YiChangZuoYong;

public class NameFormatException extends RuntimeException{
    public NameFormatException() {
    }
    public NameFormatException(String message) {
        super(message);
    }
}

AgeOutOfBoundsException异常类:

package YiChang.YiChangZuoYong;

public class AgeOutOfBoundsException extends RuntimeException{
    public AgeOutOfBoundsException() {
    }

    public AgeOutOfBoundsException(String message) {
        super(message);
    }
}

技巧:

//NameFormat:当前异常的名字表示由于参数错误而导致的问题

//Exception: 表示当前类是一个异常类

//运行时: RuntimeException 核心就表示由于参数错误而导致的问题

//编译时: Exception 核心 提醒程序员检查本地信息

同理:

在Test测试类中的修改:

运行结果如下

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杪商柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值