Copyright (c) 2000, 2017 IBM Corporation and others. This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which accompanies this distribution, and is available at https://www.eclipse.org/legal/epl-2.0/ SPDX-License-Identifier: EPL-2.0 Contributors: IBM Corporation - initial API and implementation
/******************************************************************************* * Copyright (c) 2000, 2017 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/
package org.eclipse.jdt.core.dom; import java.util.ArrayList; import java.util.List;
Try statement AST node type.
TryStatement:
    try [ ( Resources ) ]
        Block
        [ { CatchClause } ]
        [ finally Block ]

Not all node arrangements will represent legal Java constructs. In particular, at least one resource, catch clause, or finally block must be present.

A resource is either a VariableDeclarationExpression or (since JLS9) a Name.

Since:2.0
@noinstantiateThis class is not intended to be instantiated by clients.
@noextendThis class is not intended to be subclassed by clients.
/** * Try statement AST node type. * <pre> * TryStatement: * <b>try</b> [ <b>(</b> Resources <b>)</b> ] * Block * [ { CatchClause } ] * [ <b>finally</b> Block ] * </pre> * * <p> * Not all node arrangements will represent legal Java constructs. In particular, * at least one resource, catch clause, or finally block must be present.</p> * * <p>A resource is either a {@link VariableDeclarationExpression} or (since JLS9) a {@link Name}.</p> * * @since 2.0 * @noinstantiate This class is not intended to be instantiated by clients. * @noextend This class is not intended to be subclassed by clients. */
@SuppressWarnings({"rawtypes", "unchecked"}) public class TryStatement extends Statement {
The "resources" structural property of this node type (element type: VariableDeclarationExpression) (added in JLS4 API).
Deprecated:In the JLS9 API, this property is replaced by RESOURCES2_PROPERTY.
Since:3.7.1
/** * The "resources" structural property of this node type (element type: {@link VariableDeclarationExpression}) (added in JLS4 API). * @deprecated In the JLS9 API, this property is replaced by {@link #RESOURCES2_PROPERTY}. * @since 3.7.1 */
public static final ChildListPropertyDescriptor RESOURCES_PROPERTY = new ChildListPropertyDescriptor(TryStatement.class, "resources", VariableDeclarationExpression.class, CYCLE_RISK); //$NON-NLS-1$
The "resources" structural property of this node type (element type: Expression) (added in JLS9 API).
Since:3.14
/** * The "resources" structural property of this node type (element type: {@link Expression}) (added in JLS9 API). * @since 3.14 */
public static final ChildListPropertyDescriptor RESOURCES2_PROPERTY = new ChildListPropertyDescriptor(TryStatement.class, "resources", Expression.class, CYCLE_RISK); //$NON-NLS-1$
The "body" structural property of this node type (child type: Block).
Since:3.0
/** * The "body" structural property of this node type (child type: {@link Block}). * @since 3.0 */
public static final ChildPropertyDescriptor BODY_PROPERTY = new ChildPropertyDescriptor(TryStatement.class, "body", Block.class, MANDATORY, CYCLE_RISK); //$NON-NLS-1$
The "catchClauses" structural property of this node type (element type: CatchClause).
Since:3.0
/** * The "catchClauses" structural property of this node type (element type: {@link CatchClause}). * @since 3.0 */
public static final ChildListPropertyDescriptor CATCH_CLAUSES_PROPERTY = new ChildListPropertyDescriptor(TryStatement.class, "catchClauses", CatchClause.class, CYCLE_RISK); //$NON-NLS-1$
The "finally" structural property of this node type (child type: Block).
Since:3.0
/** * The "finally" structural property of this node type (child type: {@link Block}). * @since 3.0 */
public static final ChildPropertyDescriptor FINALLY_PROPERTY = new ChildPropertyDescriptor(TryStatement.class, "finally", Block.class, OPTIONAL, CYCLE_RISK); //$NON-NLS-1$
A list of property descriptors (element type: StructuralPropertyDescriptor), or null if uninitialized.
/** * A list of property descriptors (element type: * {@link StructuralPropertyDescriptor}), * or null if uninitialized. */
private static final List PROPERTY_DESCRIPTORS;
A list of property descriptors (element type: StructuralPropertyDescriptor), or null if uninitialized.
Since:3.7
/** * A list of property descriptors (element type: * {@link StructuralPropertyDescriptor}), * or null if uninitialized. * @since 3.7 */
private static final List PROPERTY_DESCRIPTORS_4_0;
A list of property descriptors (element type: StructuralPropertyDescriptor), or null if uninitialized.
Since:3.14
/** * A list of property descriptors (element type: * {@link StructuralPropertyDescriptor}), * or null if uninitialized. * @since 3.14 */
private static final List PROPERTY_DESCRIPTORS_9_0; static { List propertyList = new ArrayList(4); createPropertyList(TryStatement.class, propertyList); addProperty(BODY_PROPERTY, propertyList); addProperty(CATCH_CLAUSES_PROPERTY, propertyList); addProperty(FINALLY_PROPERTY, propertyList); PROPERTY_DESCRIPTORS = reapPropertyList(propertyList); propertyList = new ArrayList(5); createPropertyList(TryStatement.class, propertyList); addProperty(RESOURCES_PROPERTY, propertyList); addProperty(BODY_PROPERTY, propertyList); addProperty(CATCH_CLAUSES_PROPERTY, propertyList); addProperty(FINALLY_PROPERTY, propertyList); PROPERTY_DESCRIPTORS_4_0 = reapPropertyList(propertyList); propertyList = new ArrayList(5); createPropertyList(TryStatement.class, propertyList); addProperty(RESOURCES2_PROPERTY, propertyList); addProperty(BODY_PROPERTY, propertyList); addProperty(CATCH_CLAUSES_PROPERTY, propertyList); addProperty(FINALLY_PROPERTY, propertyList); PROPERTY_DESCRIPTORS_9_0 = reapPropertyList(propertyList); }
Returns a list of structural property descriptors for this node type. Clients must not modify the result.
Params:
  • apiLevel – the API level; one of the AST.JLS* constants
Returns:a list of property descriptors (element type: StructuralPropertyDescriptor)
Since:3.0
/** * Returns a list of structural property descriptors for this node type. * Clients must not modify the result. * * @param apiLevel the API level; one of the * <code>AST.JLS*</code> constants * @return a list of property descriptors (element type: * {@link StructuralPropertyDescriptor}) * @since 3.0 */
public static List propertyDescriptors(int apiLevel) { switch (apiLevel) { case AST.JLS2_INTERNAL : case AST.JLS3_INTERNAL : return PROPERTY_DESCRIPTORS; case AST.JLS4_INTERNAL : case AST.JLS8_INTERNAL : return PROPERTY_DESCRIPTORS_4_0; default : return PROPERTY_DESCRIPTORS_9_0; } }
The resource expressions (element type: Expression). Null in JLS2 and JLS3. Added in JLS4. In the deprecated JLS4 and JLS8 APIs, this used to be (element type: VariableDeclarationExpression). Defaults to an empty list (see constructor).
Since:3.7
/** * The resource expressions (element type: {@link Expression}). * Null in JLS2 and JLS3. Added in JLS4. * In the deprecated JLS4 and JLS8 APIs, this used to be * (element type: {@link VariableDeclarationExpression}). * Defaults to an empty list (see constructor). * @since 3.7 */
private ASTNode.NodeList resources = null;
The body; lazily initialized; defaults to an empty block.
/** * The body; lazily initialized; defaults to an empty block. */
private Block body = null;
The catch clauses (element type: CatchClause). Defaults to an empty list.
/** * The catch clauses (element type: {@link CatchClause}). * Defaults to an empty list. */
private ASTNode.NodeList catchClauses = new ASTNode.NodeList(CATCH_CLAUSES_PROPERTY);
The finally block, or null if none. Defaults to none.
/** * The finally block, or <code>null</code> if none. * Defaults to none. */
private Block optionalFinallyBody = null;
Creates a new AST node for a try statement owned by the given AST. By default, the try statement has no resources, an empty block, no catch clauses, and no finally block.

N.B. This constructor is package-private.

Params:
  • ast – the AST that is to own this node
/** * Creates a new AST node for a try statement owned by the given * AST. By default, the try statement has no resources, an empty block, no catch * clauses, and no finally block. * <p> * N.B. This constructor is package-private. * </p> * * @param ast the AST that is to own this node */
TryStatement(AST ast) { super(ast); if (ast.apiLevel >= AST.JLS9_INTERNAL) { this.resources = new ASTNode.NodeList(RESOURCES2_PROPERTY); } else if (ast.apiLevel >= AST.JLS4_INTERNAL) { this.resources = new ASTNode.NodeList(RESOURCES_PROPERTY); } } @Override final List internalStructuralPropertiesForType(int apiLevel) { return propertyDescriptors(apiLevel); } @Override final ASTNode internalGetSetChildProperty(ChildPropertyDescriptor property, boolean get, ASTNode child) { if (property == BODY_PROPERTY) { if (get) { return getBody(); } else { setBody((Block) child); return null; } } if (property == FINALLY_PROPERTY) { if (get) { return getFinally(); } else { setFinally((Block) child); return null; } } // allow default implementation to flag the error return super.internalGetSetChildProperty(property, get, child); } @Override final List internalGetChildListProperty(ChildListPropertyDescriptor property) { if (property == RESOURCES_PROPERTY || property == RESOURCES2_PROPERTY) { return resources(); } if (property == CATCH_CLAUSES_PROPERTY) { return catchClauses(); } // allow default implementation to flag the error return super.internalGetChildListProperty(property); } @Override final int getNodeType0() { return TRY_STATEMENT; } @Override ASTNode clone0(AST target) { TryStatement result = new TryStatement(target); result.setSourceRange(getStartPosition(), getLength()); result.copyLeadingComment(this); if (this.ast.apiLevel >= AST.JLS4_INTERNAL) { result.resources().addAll( ASTNode.copySubtrees(target, resources())); } result.setBody((Block) getBody().clone(target)); result.catchClauses().addAll( ASTNode.copySubtrees(target, catchClauses())); result.setFinally( (Block) ASTNode.copySubtree(target, getFinally())); return result; } @Override final boolean subtreeMatch0(ASTMatcher matcher, Object other) { // dispatch to correct overloaded match method return matcher.match(this, other); } @Override void accept0(ASTVisitor visitor) { boolean visitChildren = visitor.visit(this); if (visitChildren) { // visit children in normal left to right reading order if (this.ast.apiLevel >= AST.JLS4_INTERNAL) { acceptChildren(visitor, this.resources); } acceptChild(visitor, getBody()); acceptChildren(visitor, this.catchClauses); acceptChild(visitor, getFinally()); } visitor.endVisit(this); }
Returns the body of this try statement.
Returns:the try body
/** * Returns the body of this try statement. * * @return the try body */
public Block getBody() { if (this.body == null) { // lazy init must be thread-safe for readers synchronized (this) { if (this.body == null) { preLazyInit(); this.body = new Block(this.ast); postLazyInit(this.body, BODY_PROPERTY); } } } return this.body; }
Sets the body of this try statement.
Params:
  • body – the block node
Throws:
  • IllegalArgumentException – if:
    • the node belongs to a different AST
    • the node already has a parent
    • a cycle in would be created
/** * Sets the body of this try statement. * * @param body the block node * @exception IllegalArgumentException if: * <ul> * <li>the node belongs to a different AST</li> * <li>the node already has a parent</li> * <li>a cycle in would be created</li> * </ul> */
public void setBody(Block body) { if (body == null) { throw new IllegalArgumentException(); } ASTNode oldChild = this.body; preReplaceChild(oldChild, body, BODY_PROPERTY); this.body = body; postReplaceChild(oldChild, body, BODY_PROPERTY); }
Returns the live ordered list of catch clauses for this try statement.
Returns:the live list of catch clauses (element type: CatchClause)
/** * Returns the live ordered list of catch clauses for this try statement. * * @return the live list of catch clauses * (element type: {@link CatchClause}) */
public List catchClauses() { return this.catchClauses; }
Returns the finally block of this try statement, or null if this try statement has no finally block.
Returns:the finally block, or null if this try statement has none
/** * Returns the finally block of this try statement, or <code>null</code> if * this try statement has <b>no</b> finally block. * * @return the finally block, or <code>null</code> if this try statement * has none */
public Block getFinally() { return this.optionalFinallyBody; }
Sets or clears the finally block of this try statement.
Params:
  • block – the finally block node, or null if there is none
Throws:
  • IllegalArgumentException – if:
    • the node belongs to a different AST
    • the node already has a parent
    • a cycle in would be created
/** * Sets or clears the finally block of this try statement. * * @param block the finally block node, or <code>null</code> if * there is none * @exception IllegalArgumentException if: * <ul> * <li>the node belongs to a different AST</li> * <li>the node already has a parent</li> * <li>a cycle in would be created</li> * </ul> */
public void setFinally(Block block) { ASTNode oldChild = this.optionalFinallyBody; preReplaceChild(oldChild, block, FINALLY_PROPERTY); this.optionalFinallyBody = block; postReplaceChild(oldChild, block, FINALLY_PROPERTY); }
Returns the live ordered list of resources for this try statement (added in JLS4 API).

A resource is either a VariableDeclarationExpression or (since JLS9) a Name.

Throws:
Returns:the live list of resources (element type: Expression). In the deprecated JLS4 and JLS8 APIs, this used to be (element type: VariableDeclarationExpression).
Since:3.7.1
/** * Returns the live ordered list of resources for this try statement (added in JLS4 API). * * <p>A resource is either a {@link VariableDeclarationExpression} or (since JLS9) a {@link Name}.</p> * * @return the live list of resources (element type: {@link Expression}). * In the deprecated JLS4 and JLS8 APIs, this used to be * (element type: {@link VariableDeclarationExpression}). * @exception UnsupportedOperationException if this operation is used * in a JLS2 or JLS3 AST * @since 3.7.1 */
public List resources() { // more efficient than just calling unsupportedIn2_3() to check if (this.resources == null) { unsupportedIn2_3(); } return this.resources; } @Override int memSize() { return super.memSize() + 4 * 4; } @Override int treeSize() { return memSize() + (this.resources == null ? 0 : this.resources.listSize()) + (this.body == null ? 0 : getBody().treeSize()) + this.catchClauses.listSize() + (this.optionalFinallyBody == null ? 0 : getFinally().treeSize()); } }