JAVA入门学习之自定义异常报错

Java入门学习之自定义异常报错

一、为什么要学习自定义异常报错?

在我们平常写代码时都会出现异常报错的情况,我们可以根据报错的信息来解决代码存在的bug。然而,Java无法为全部问题都提供异常类来提醒我们。因此我们在进行项目开发的时候,程序员A在调用程序员B写的代码时出现了bug没有用异常类的形式进行输出或者反馈给程序员A,那么A则不知道调用是否成功。所以我们自己定义异常类来提醒我们调用方法失败,方便调用者知道自己是否调用成功,如果调用不成功也可以知道调用错误的原因。

二、异常的体系是什么?

异常体系如下
在这里插入图片描述

其中,错误主要分为两种:
1、Error代表的是系统级别的错误(属于严重错误),这个错误是给sun公司自己使用的,不需要我们理会。
2、Exception才叫异常,它代表的才是我们程序可能出现的问题。所以程序员通常会用Exception和它的“孩子们”来封装程序可能出现的问题。一般它的孩子分为两种,一种是运行时异常RuntimeException。一种时编译时异常,在上面的图中用其它异常来表示了。
一般我们自定义异常类都是第二种。

二、自定义异常的作用

我们可以让上层调用者知道自己调用是否成功,如例2.1所示:
例2.1:

public class RegexTest3 {
    public static void main(String[] args) throws Exception{
        Age(250);
    }
    public static void Age(int age) throws Exception{
        if(age >= 0 && age <= 150){
            System.out.println("年龄符合要求");
        }
        else {
            System.out.println("年龄非法");
        }
    }
}

在上面的代码中,在main中调用了Age()方法,如果年龄超过了规定范围,只能输出一个“年龄非法”,相反,如果我们采用了异常类的形式,如例2.2和2.3所示:
例2.2:

public class RegexTest3 {
    public static void main(String[] args) throws Exception{  //这里的throws Exception 也是把问题抛出给上一次,也就是JVM虚拟机。如果不想再次抛出,则可以利用try-catch来捕获异常,下面将会有例子展示。
        Age(250);
    }
    public static void Age(int age) throws Exception{ //throws Exception 是把问题抛出给上一层
        if(age >= 0 && age <= 150){
            System.out.println("年龄符合要求");
        }
        else {
        	//用一个异常对象来封装这个问题
            throw new AgeError("年龄不符合要求");
        }
    }
}

例2.3:

//经过封装的异常类
public class AgeError extends Exception{
    public AgeError() {
    }

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

如果我们采用上面异常类的形式,那么调用者就能够清楚的知道调用出现了问题,并报错了。下面时报错的相关信息

D:\Software\JDK\bin\java.exe "-javaagent:D:\Software\IntelliJ IDEA 2021.3.3\lib\idea_rt.jar=61437:D:\Software\IntelliJ IDEA 2021.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\JAVA_Project\zhengze\out\production\zhengze Zheng_ze_biao_da.RegexTest3
Exception in thread "main" Zheng_ze_biao_da.AgeError: 年龄不符合要求
	at Zheng_ze_biao_da.RegexTest3.Age(RegexTest3.java:12)
	at Zheng_ze_biao_da.RegexTest3.main(RegexTest3.java:5)

三、异常常见的处理方式

出现异常时,一般开发有两种常见的处理方式,分别如下:
1、捕获异常,记录异常后并响应合适的信息或者内容给用户
例3.1:

import java.util.Scanner;

public class RegexTest3 {
    public static void main(String[] args){
        try {
            Age();
        } catch (Exception e) {
            System.out.println("您当前操作有问题"); //这里就是将异常通过合适的信息展示给用户
            e.printStackTrace(); //会给出详细的报错信息
        }
    }
    public static void Age() throws Exception{
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您的年龄:");
        int age = sc.nextInt();
        if(age >= 0 && age <= 150){
            System.out.println("年龄符合要求");
        }
        else {
            throw new AgeError("年龄不符合要求");
        }
    }
}

如果输入的年龄存在问题,那么执行的结果如下:

请输入您的年龄:
1190
您当前操作有问题  //这里就是将出现的问题通过合适的信息或者内容展示给用户,下面就是给出了详细的报错信息,如果把e.printStackTrace();进行注释,则下面的信息将不会出现
Zheng_ze_biao_da.AgeError: 年龄不符合要求
	at Zheng_ze_biao_da.RegexTest3.Age(RegexTest3.java:22)
	at Zheng_ze_biao_da.RegexTest3.main(RegexTest3.java:8)

Process finished with exit code 0

2、捕获异常,并且尝试修复
例3.2:

import java.util.Scanner;

public class RegexTest3 {
    public static void main (String[] args){
        while (true) {
            try {
                System.out.println(Age());
                break;
            } catch (Exception e) {
                System.out.println("您当前操作有问题吗,请您重新输入!!"); //这里就是将异常通过合适的信息展示给用户
            }
        }
    }
    public static double Age() throws Exception {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入您的年龄:");
            int age = sc.nextInt();
            if (age >= 0 && age <= 150) {
                System.out.println("年龄符合要求");
                return age;
            } else {
                System.out.println("您输入的年龄是不符合要求的");
            }
        }
    }
}

上面这段代码将会捕获异常并尝试进行修复,直到异常不存在,执行结果如下所示。

请输入您的年龄:
190
您输入的年龄是不符合要求的
请输入您的年龄:
aedfd
您当前操作有问题吗,请您重新输入!!
请输入您的年龄:
14
年龄符合要求
14.0

Process finished with exit code 0

注意::一般如果A调用B,B调用C,然后C存在异常的话,C可以把异常throws抛给B,然后B再抛给A,最后在A中利用上面两种解决异常的方式去解决问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 自定义异常可以用来在特定的业务场景中抛出异常。在判断用户名的场景中,可以自定义一个异常类来表示用户名不合法。例如: ```java class InvalidUsernameException extends Exception { public InvalidUsernameException(String message) { super(message); } } ``` 在业务逻辑中,当用户名不合法时,可以抛出该异常。例如: ```java if (!isValidUsername(username)) { throw new InvalidUsernameException("Invalid username: " + username); } ``` 在调用的地方可以使用 try-catch 语句来捕获该异常。 ```java try { register(username); } catch (InvalidUsernameException e) { System.out.println(e.getMessage()); } ``` 这样, 当用户输入不合法的用户名时,就可以在 catch 中输出错信息了。 ### 回答2: 在Java编程中,当程序出现异常时,我们可以使用异常处理机制来处理这些异常。异常处理机制允许我们捕获、处理和报告程序执行过程中的异常情况。在Java中有很多内置的异常类型,例如:数组越界异常、空指针异常、类型转换异常等。除此之外,Java还支持自定义异常,可以根据个人需求来定义异常类型。 在本文中,我们将讨论如何使用自定义异常来判断用户名的合法性。通常情况下,我们需要根据一些规则来判断用户名是否合法,例如:是否包含非法字符、是否太短或太长等。 首先,我们需要创建一个自定义异常类,用来处理用户名不合法的情况。该异常类可以继承于Java内置的异常类,例如:Exception、RuntimeException等。在自定义异常类中,我们可以定义一些成员变量和构造方法,用来保存异常信息和创建异常对象。 然后,我们可以在判断用户名的方法中抛出自定义异常,例如: ```java public void checkUsername(String username) throws IllegalUsernameException { if (username.length() < 6 || username.length() > 18) { throw new IllegalUsernameException("用户名长度必须在6到18个字符之间!"); } if (!username.matches("^[a-zA-Z]\\w{5,17}$")) { throw new IllegalUsernameException("用户名只能包含字母、数字、下划线,且以字母开头!"); } } ``` 以上代码中,我们使用了两个条件语句来判断用户名的合法性。如果用户名不符合规则,则会抛出自定义异常对象IllegalUsernameException,并将异常信息传递给构造方法。 最后,我们需要在调用判断用户名的方法时,使用try-catch代码块来捕获异常。例如: ```java try { checkUsername(username); System.out.println("用户名合法!"); } catch (IllegalUsernameException e) { System.out.println("用户名不合法:" + e.getMessage()); } ``` 如果用户名合法,则会输出“用户名合法!”,否则会输出“用户名不合法:异常信息”。 总之,使用自定义异常可以更加灵活地处理程序中的异常情况,并能够根据个人需求来定义异常类型。在判断用户名的场景中,使用自定义异常也可以提高代码的可读性和健壮性。 ### 回答3: Java是一种很流行的编程语言,而异常处理是Java编程中必不可少的部分。Java异常处理提供了一种在程序执行期间处理错误的方法,这种错误可能导致程序的崩溃。Java中的异常分为两种:已检查异常(Checked Exception)和未检查异常(Unchecked Exception)。在开发Java应用时,有时需要自定义异常来满足特定的需求,比如在判断用户名时需要自定义一个异常。 判断用户名是Web开发和客户端开发中必不可少的部分。在Java中,可以使用正则表达式、字符过滤、长度限制等方式来验证用户名,但是当这些方式无法满足时,我们可以自定义异常来实现对用户名的验证。 首先,需要定义一个自定义异常类来处理用户名验证时可能出现的异常。我们可以创建一个继承于Exception的类,并在该类中实现构造函数,用来接收异常信息。例如: ``` public class UsernameException extends Exception { public UsernameException(String message) { super(message); } } ``` 然后,在判断用户名的方法中,如果出现了用户名不合格的情况,就可以抛出自定义异常。例如: ``` public void checkUsername(String username) throws UsernameException { if (username.length() < 6 || username.length() > 12) { throw new UsernameException("用户名长度应在6-12之间"); } if (!username.matches("[a-zA-Z0-9]+")) { throw new UsernameException("用户名只能由字母和数字组成"); } } ``` 在上述代码中,我们通过判断用户名长度和用户名是否由字母和数字组成来验证用户名,并可以通过抛出自定义异常提示用户错误信息。 最后,在调用判断用户名方法的地方,需要使用try-catch语句来捕捉可能出现的异常。例如: ``` try { checkUsername(username); } catch (UsernameException e) { e.printStackTrace(); } ``` 通过以上方式,我们可以自定义一个异常来判断用户名,使得判断过程更方便、更灵活,也能给用户更友好的提示信息。除此之外,在其他处同样需要判断用户名时,只需要调用此方法即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值