在java中创建自定义异常

时间:2018-04-18 13:54:05

标签: java exception-handling

在接受采访时,我最近被问到以下问题:

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

  1. 已检查例外延长Exception Exception类或子类
  2. 未选中例外展开RuntimeExceptionRuntimeException子类。
  3. 给出什么可能的答案?

7 个答案:

答案 0 :(得分:3)

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

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所说的......但是人们认为是这样的。

答案 1 :(得分: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。 extra 方法与我们通常为处理所有异常而创建的方法非常相似。事实上,您可以轻松地为所有异常复制粘贴此方法。您所要做的就是将 Exception 类更改为您的异常并更改 HttpStatus。.

@ExceptionHandler(ResourceAlreadyExistsException.class)
public final ResponseEntity<ExceptionResponse> handleResourceAlreadyExistsException(
    ResourceAlreadyExistsException ex, WebRequest req) {
    ExceptionResponse exceptionResponse = new ExceptionResponse(
        new Date(),
        ex.getMessage(),
        req.getDescription(false)
    );
    return new ResponseEntity<>(exceptionResponse, HttpStatus.UNPROCESSABLE_ENTITY);

答案 2 :(得分:1)

可以扩展Throwable类。

答案 3 :(得分:1)

因为OP专门询问而不使用扩展(我认为你不能扩展像Throwable这样的类)你可以使用Exception和参数:

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

现在,无论您何时捕获此异常,都可以查看消息,如

if(e.getMessage().equals("this is my custom exception")){
  //TODO code here
}

现在我会解雇那些会像这样编写代码的人,但是为了采访的缘故哦......

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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/

答案 6 :(得分:-1)

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