<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>InvalidResourceUsageException.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Apache Shiro :: Core</a> &gt; <a href="index.source.html" class="el_package">org.apache.shiro.dao</a> &gt; <span class="el_source">InvalidResourceUsageException.java</span></div><h1>InvalidResourceUsageException.java</h1><pre class="source lang-java linenums">/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * &quot;License&quot;); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.shiro.dao;

/**
 * Root exception indicating invalid or incorrect usage of a data access resource.  This is thrown
 * typically when incorrectly using the resource or its API.
 *
 * @since 1.2
 */
public class InvalidResourceUsageException extends DataAccessException {

    /**
     * Constructs an InvalidResourceUsageException with a message explaining the cause of the exception.
     *
     * @param message the message explaining the cause of the exception
     */
    public InvalidResourceUsageException(String message) {
<span class="nc" id="L35">        super(message);</span>
<span class="nc" id="L36">    }</span>

    /**
     * Constructs a InvalidResourceUsageException with a message explaining the cause of the exception.
     *
     * @param message the explanation
     * @param cause   the root cause of the exception, typically an API-specific exception
     */
    public InvalidResourceUsageException(String message, Throwable cause) {
<span class="nc" id="L45">        super(message, cause);</span>
<span class="nc" id="L46">    }</span>
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.eclemma.org/jacoco">JaCoCo</a> 0.7.7.201606060606</span></div></body></html>