Lombok注解 @SneakyThrows

阅读数:76 评论数:0

跳转到新版页面

分类

python/Java

正文

一、简介

1、java中我们常见的两类异常:

(1)普通Exception类

(2)RuntimeException

前者会强制要求抛出它的方法声明throws,调用者必须显示的去处理这个异常。设计的目的是为了提醒开发者处理一些场景中必然可能存在的异常情况。

但是大部情况下的异常,我们都是一路往外抛了事,所以常见的处理手段就是外面包一层RuntimeException,接着往上丢,这种解决思想在Spring中很常见。

try{
}catch(Exception e){
throw new RuntimeException(e);
}

2、Lombok的@SneakyThrows

@SneakyThrows 注解的作用是将被注解的方法中的受检查异常(checked exception)转换为不受检查异常(unchecked exception),方便开发者使用。这样可以简化代码,避免了在方法签名中声明受检查异常并在方法体中处理异常的繁琐过程

 import lombok.SneakyThrows;

public class SneakyThrowsExample implements Runnable {
  @SneakyThrows(UnsupportedEncodingException.class)
  public String utf8ToString(byte[] bytes) {
    return new String(bytes, "UTF-8");
  }
  
  @SneakyThrows
  public void run() {
    throw new Throwable();
  }
}

真正生成的代码

import lombok.Lombok;

public class SneakyThrowsExample implements Runnable {
  public String utf8ToString(byte[] bytes) {
    try {
      return new String(bytes, "UTF-8");
    } catch (UnsupportedEncodingException e) {
      throw Lombok.sneakyThrow(e);
    }
  }
  
  public void run() {
    try {
      throw new Throwable();
    } catch (Throwable t) {
      throw Lombok.sneakyThrow(t);
    }
  }
}

二、原理

    public static RuntimeException sneakyThrow(Throwable t) {
        if (t == null) throw new NullPointerException("t");
        return Lombok.<RuntimeException>sneakyThrow0(t);
    }

    private static <T extends Throwable> T sneakyThrow0(Throwable t) throws T {
        throw (T)t;
    }
    

利用泛型将我们传入的Throwable强转为RuntimeException,因为泛型被存储为字节码时并没有泛型的信息,所以可以骗过javac编译器。

三、Java中两种异常类型

1、受检异常(Checked Exception)

(1)受检异常是指在编译时必须处理的异常。这些异常必须在代码中显式地进行捕获(使用try-catch语句)或者在方法声明中通过throws子句声明抛出,否则编译器会报错。

(2)典型的受检异常包括IOException、SQLException等。这些异常通常表示程序在运行时遇到了无法预知的外部条件或错误,需要程序员在代码中进行处理。

2、非受检异常(Unchecked Exception)

(1)非受检异常是指在编译时不需要强制处理的异常。这些异常通常是由程序员的错误或者运行环境的严重问题导致的,比如空指针异常(NullPointerException)、数组下标越界异常(ArrayIndexOutOfBoundsException)等。

(2)与受检异常不同,编译器不会强制要求程序员在代码中处理非受检异常,因此也可以称为运行时异常(RuntimeException)

(3)非受检异常一般是程序员可以预见并且应该尽量避免的异常,它们通常暗示着代码中存在错误或不合理的设计。




相关推荐

如果不想每次都写 private final Logger logger = LoggerFactory.getL

一、lombok介绍 lombok能够极大简化我们写的代码,使用注解的方式省略get set toString等方法,便得代码看起来更加的美观。lombok是在编译时候生成对应的方法的。所以在性能上面

它是lombok中的注解,作用在类上。 它添加一个构造函数,该构造函数含有所有已声明字段属性为入参数。

1、此注解会生成equals(Object other)和hashCode()方法。 2、默认使用非静态、非瞬态的属性。 3、可通过参数exclude排除一些属性。 4、可通过参数of指定仅使用哪些属

一、chain属性 链式访问,该注解设置chain=true,生成setter方法返回this(也就是返回的是对象),代替了默认的返回void。 package com.pollyduan; imp