Java Exceptions
通常有一个(以及其他)可以采用Throwable原因的构造函数,因此当重新抛出异常时,可以给出原始异常,它将在日志中显示为
com.stacktrace.from.application.exception...
Caused by
net.stacktrace.of.code.throwing.original.exception...
但StringIndexOutOfBoundsException
只有()
,(int index)
或(String s)
。没有构造函数接受原因!!
查看类型层次结构似乎Exception
和RuntimeException
都很好,但已IndexOutOfBoundsException
已失去(String s, Throwable cause)
构造函数。
我知道构造函数不是继承的,但是为什么对IndexOutOfBoundsException
和StringIndexOutOfBoundsException
没有类似的构造函数?
答案 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);