StringIndexOutOfBoundsException不能在构造函数中使用“cause”

时间:2016-05-06 10:02:32

标签: java exception

Java Exceptions通常有一个(以及其他)可以采用Throwable原因的构造函数,因此当重新抛出异常时,可以给出原始异常,它将在日志中显示为

com.stacktrace.from.application.exception...
Caused by
net.stacktrace.of.code.throwing.original.exception...

StringIndexOutOfBoundsException只有()(int index)(String s)。没有构造函数接受原因!!

查看类型层次结构似乎ExceptionRuntimeException都很好,但已IndexOutOfBoundsException已失去(String s, Throwable cause)构造函数。

我知道构造函数不是继承的,但是为什么IndexOutOfBoundsExceptionStringIndexOutOfBoundsException没有类似的构造函数?

2 个答案:

答案 0 :(得分:2)

IndexOutOfBoundsException不是唯一没有cause参数构造函数的Throwable。例如,NullPointerException也是如此。我相信还有更多。解释很简单,这些是根本原因。它们不是由其他异常引起的,而是由JVM直接抛出的。程序员的错误或外部源都会导致它们。

当然,您可以在创建和抛出异常时使用带有异常描述的构造函数。

答案 1 :(得分:1)

似乎不应该有原因的异常没有带有Throwable参数的构造函数。您仍然可以通过 try{ "aaa".substring(10); }catch(IndexOutOfBoundsException e){ e.initCause(new RuntimeException("some cause exception")); throw e; } 方法向任何异常添加原因:

Tax hashKeyValue = new Tax();
hashKeyValue.setUserId(userId);
Condition scanFilterCondition = new Condition()
.withComparisonOperator(ComparisonOperator.IN)
.withAttributeValueList(taxIds.stream()
                        .map(t -> new AttributeValue().withS(t))
                        .collect(Collectors.toList())
                       );
Map<String, Condition> conditions = new HashMap<>();
conditions.put("id", scanFilterCondition);
DynamoDBQueryExpression<Transaction> dynamoDBQueryExpression = new DynamoDBQueryExpression<Transaction>()
                .withIndexName(null)
                .withConsistentRead(false)
                .withHashKeyValues(hashKeyValue)
                .withQueryFilter(conditions);
return getMapper().query(Transaction.class, dynamoDBQueryExpression);