【问题标题】:Creating custom exception in java在java中创建自定义异常
【发布时间】:2018-04-18 13:54:04
【问题描述】:

在一次采访中,我最近被问到以下问题:

有没有其他方法可以在不使用extends 的情况下创建自定义Exception

  1. 扩展Exception 类或Exception 的子类以用于检查异常
  2. unchecked异常扩展RuntimeExceptionRuntimeException的子类。

可能的答案是什么?

【问题讨论】:

  • 老实说这是一个愚蠢的问题,创建异常的逻辑方法是扩展它,因为Dog 会扩展Animal 等等。
  • 有可能,但面试时不能说,
  • 是的,这很愚蠢。但想法是看受访者对Java语言细节的理解程度。

标签: java exception-handling


【解决方案1】:

如果不使用扩展异常类,您根本无法做到这一点。但是你可以在没有明确的 extends ... 的情况下实现它。

public class Test {
    public void method() {
        throw new RuntimeException() {};
    }
}

上面声明并抛出了RuntimeException的匿名子类。

当然,这是一件毫无意义的事情。由于该类是匿名的,因此您不能在 throws 子句中命名它或在异常处理程序中按名称处理它。

另请参阅:Throw anonymous exceptions in Java


或者,您可以扩展ErrorError 的子类或..Throwable。但你不应该。

  • Error 异常通常被认为是由 JVM 或标准库定义和抛出的1。因此,Error 层次结构中的自定义子类(至少可以说)令人惊讶。
  • 如果您直接扩展Throwable,您有责任破坏代码假定ExceptionErrorThrowable 的唯一子类。

1 - 这不是 javadoc 所说的......但人们认为是这种情况。

【讨论】:

    【解决方案2】:

    让我们创建一个自定义 ResourceAlreadyExistsException 类。它将扩展 RuntimeException 类,您可以向其添加任意数量的参数。我一直保持这样简洁。

    public class ResourceAlreadyExistsException extends RuntimeException {
    
        public ResourceAlreadyExistsException(String property, String value) {
            super(String.format(
                "Resource with property %s and value %s already exists." +
                "Make sure to insert a unique value for %s",
                property, value, property));
        }
    }
    

    每当我需要检查唯一资源时,我都可以告诉用户哪个特定属性具有导致错误的值。此外,我通知用户必须采取什么措施来避免错误。

    说,我选择对我的 ResourceAlreadyExistsException 使用错误 ***。不过,我需要将此错误消息连接到 ExceptionResponseHandler。额外的方法与我们通常创建的用于处理所有异常的方法非常相似。事实上,您可以轻松地复制粘贴此方法来处理您拥有的所有异常。您所要做的就是将 Exception 类更改为您的异常并更改 HttpStatus..

    @ExceptionHandler(ResourceAlreadyExistsException.class)
    public final ResponseEntity handleResourceAlreadyExistsException(
        ResourceAlreadyExistsException ex, WebRequest req) {
        异常响应异常响应 = 新异常响应(
            新日期(),
            例如getMessage(),
            req.getDescription(false)
        );
        返回新的 ResponseEntity(exceptionResponse, HttpStatus.UNPROCESSABLE_ENTITY);
    

    【讨论】:

      【解决方案3】:

      可以扩展 Throwable 类。

      【讨论】:

        【解决方案4】:

        由于 OP 特别要求 不使用扩展(我认为你不能扩展像 Throwable 这样的类),你可以使用 Exception 和以下参数:

        throw new Exception("this is my custom exception");
        

        现在,无论您在哪里发现此异常,您都可以像

        一样检查消息
        if(e.getMessage().equals("this is my custom exception")){
          //TODO code here
        }
        

        现在我会解雇任何会编写这样代码的人,但为了面试,好吧……

        【讨论】:

          【解决方案5】:

          您可以扩展Throwable,但不建议这样做。

          【讨论】:

            【解决方案6】:

            Java 中的自定义异常也称为用户自定义异常。在这个 Exception 类中可以由用户自己创建。异常消息、异常生成、异常处理,一切都是由用户或开发者创建和管理的。我们必须创建一个异常类,只是通过预定义的泛化异常类对其进行扩展。

            class UserDefineException extends Exception
            {
            public UserDefineException()
            {
            super(“Invalid Age Exception”);
            }
            }
            public class TestDemo
            {
            public static void main(String[] args)
            {
            if(args.length ==0)
            System.out.println(“Age”);
            else
            {
            try
            {
            int age = Integer.parseInt(args[0]);
            if(age<18 || age>60)
            {
            throw new UserDefineException();
            }
            else
            {
            System.out.println(“Group of Party”);
            }
            }
            catch(UserDefineException e)
            {
            System.out.println(e);
            }
            }
            System.out.println(“Normal Flow”);
            }
            }

            欲了解更多信息,请查看此链接:https://arzatechs.com/how-to-use-custom-exception-in-java/

            【讨论】:

              【解决方案7】:

              你可以导入一个异常而不是扩展它。只需导入包并在您的自定义异常中使用它。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-02-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-12-17
                • 2011-04-26
                • 2017-06-04
                相关资源
                最近更新 更多