www.pluralsight.com Open in urlscan Pro
2606:4700::6811:2455  Public Scan

Submitted URL: http://connect.pluralsight.com/MzAzLU1OSS04MDkAAAGQ4YGH3-B5UlbvQ80mOxWyn1Hz8PV5uDQ7u5EaApSF3iSfTsb6ABBgFhi-ktzYeiaTJ8O7fVw=
Effective URL: https://www.pluralsight.com/resources/blog/software-development/java-throw-exception?utm_source=marketo&utm_medium=email&utm...
Submission: On January 26 via api from ES — Scanned from ES

Form analysis 4 forms found in the DOM

<form class="header-search-form">
  <input class="header-search-input" type="text" name="q" placeholder="What do you want to learn?" autocomplete="off">
</form>

<form class="header-search-form -flex-and-center">
  <input class="header-search-input flex-1" type="text" name="q" placeholder="Search" autocomplete="off">
  <button type="submit">
    <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" role="button">
      <title>A search magnifying glass</title>
      <mask id="mask0_3541_6692" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="2" y="2" width="20" height="20">
        <path fill-rule="evenodd" clip-rule="evenodd"
          d="M21.3534 19.9404L21.3535 19.9404L16.314 14.9C17.403 13.504 18 11.799 18 10C18 7.863 17.167 5.856 15.656 4.344C14.145 2.832 12.137 2 10 2C7.863 2 5.854 2.832 4.344 4.344C2.832 5.856 2 7.863 2 10C2 12.137 2.832 14.146 4.344 15.656C5.854 17.168 7.863 18 10 18C11.799 18 13.504 17.404 14.9 16.315L19.9394 21.3544C20.1347 21.5497 20.4513 21.5497 20.6466 21.3544L21.3534 20.6476L21.3534 20.6475C21.5487 20.4523 21.5487 20.1357 21.3534 19.9404ZM14.242 14.243C13.109 15.376 11.602 16 10 16C8.397 16 6.891 15.376 5.758 14.243C4.624 13.11 4 11.603 4 10C4 8.398 4.624 6.891 5.758 5.758C6.891 4.624 8.397 4 10 4C11.602 4 13.109 4.624 14.242 5.758C15.376 6.891 16 8.398 16 10C16 11.603 15.376 13.11 14.242 14.243Z"
          fill="white"></path>
      </mask>
      <g mask="url(#mask0_3541_6692)">
        <rect width="24" height="24" fill="#A5AACF"></rect>
      </g>
    </svg>
  </button>
</form>

<form id="customMarketo_1298" data-mkto-id="1298">
  <div class="marketo-form-field">
    <label for="FirstName" class="mrkto_text_lbl">First Name<span class="requiredAsterix">*</span></label>
    <input type="text" id="1298_FirstName" class="mrkto_text" name="FirstName" required="" oninvalid="setCustomValidity('This field is required.)" oninput="setCustomValidity('')" maxlength="255">
  </div>
  <div class="marketo-form-field">
    <label for="LastName" class="mrkto_text_lbl">Last Name<span class="requiredAsterix">*</span></label>
    <input type="text" id="1298_LastName" class="mrkto_text" name="LastName" required="" oninvalid="setCustomValidity('This field is required.)" oninput="setCustomValidity('')" maxlength="255">
  </div>
  <div class="marketo-form-field">
    <label for="Email" class="mrkto_text_lbl">Email Address<span class="requiredAsterix">*</span></label>
    <input type="email" id="1298_Email" class="mrkto_email" name="Email" required="" oninvalid="setCustomValidity('Must be valid email. example@yourdomain.com)" oninput="setCustomValidity('')" maxlength="255">
  </div>
  <div class="marketo-form-field">
    <label for="Company" class="mrkto_text_lbl">Company<span class="requiredAsterix">*</span></label>
    <input type="text" id="1298_Company" class="mrkto_text" name="Company" required="" oninvalid="setCustomValidity('This field is required.)" oninput="setCustomValidity('')" maxlength="255">
  </div>
  <div class="marketo-form-field">
    <label for="Title" class="mrkto_text_lbl">Job Title<span class="requiredAsterix">*</span></label>
    <input type="text" id="1298_Title" class="mrkto_text" name="Title" required="" oninvalid="setCustomValidity('This field is required.)" oninput="setCustomValidity('')" maxlength="255">
  </div>
  <div class="marketo-form-field">
    <label for="Phone" class="mrkto_text_lbl">Phone<span class="requiredAsterix">*</span></label>
    <input type="text" id="1298_Phone" class="mrkto_text" name="Phone" required="" oninvalid="setCustomValidity('This field is required.)" oninput="setCustomValidity('')" maxlength="255">
  </div>
  <div class="marketo-form-field">
    <label for="Country" class="mrkto_select_lbl">Country<span class="requiredAsterix">*</span></label>
    <select id="1298_Country" class="mrkto_select" name="Country" required="" oninvalid="setCustomValidity('This field is required.)" oninput="setCustomValidity('')">
      <option value="">Select...</option>
      <option value="United States">United States</option>
      <option value="Afghanistan">Afghanistan</option>
      <option value="Aland Islands">Aland Islands</option>
      <option value="Albania">Albania</option>
      <option value="Algeria">Algeria</option>
      <option value="American Samoa">American Samoa</option>
      <option value="Andorra">Andorra</option>
      <option value="Angola">Angola</option>
      <option value="Anguilla">Anguilla</option>
      <option value="Antarctica">Antarctica</option>
      <option value="Antigua and Barbuda">Antigua and Barbuda</option>
      <option value="Argentina">Argentina</option>
      <option value="Armenia">Armenia</option>
      <option value="Aruba">Aruba</option>
      <option value="Australia">Australia</option>
      <option value="Austria">Austria</option>
      <option value="Azerbaijan">Azerbaijan</option>
      <option value="Bahamas">Bahamas</option>
      <option value="Bahrain">Bahrain</option>
      <option value="Bangladesh">Bangladesh</option>
      <option value="Barbados">Barbados</option>
      <option value="Belarus">Belarus</option>
      <option value="Belgium">Belgium</option>
      <option value="Belize">Belize</option>
      <option value="Benin">Benin</option>
      <option value="Bermuda">Bermuda</option>
      <option value="Bhutan">Bhutan</option>
      <option value="Bolivia">Bolivia</option>
      <option value="Bonaire, Saint Eustatius and Saba">Bonaire, Saint Eustatius and Saba</option>
      <option value="Bosnia and Herzegovina">Bosnia and Herzegovina</option>
      <option value="Botswana">Botswana</option>
      <option value="Bouvet Island">Bouvet Island</option>
      <option value="Brazil">Brazil</option>
      <option value="British Indian Ocean Territory">British Indian Ocean Territory</option>
      <option value="Brunei Darussalam">Brunei Darussalam</option>
      <option value="Bulgaria">Bulgaria</option>
      <option value="Burkina Faso">Burkina Faso</option>
      <option value="Burundi">Burundi</option>
      <option value="Cambodia">Cambodia</option>
      <option value="Cameroon">Cameroon</option>
      <option value="Canada">Canada</option>
      <option value="Cape Verde">Cape Verde</option>
      <option value="Cayman Islands">Cayman Islands</option>
      <option value="Central African Republic">Central African Republic</option>
      <option value="Chad">Chad</option>
      <option value="Chile">Chile</option>
      <option value="China">China</option>
      <option value="Christmas Island">Christmas Island</option>
      <option value="Cocos (Keeling) Islands">Cocos (Keeling) Islands</option>
      <option value="Colombia">Colombia</option>
      <option value="Comoros">Comoros</option>
      <option value="Congo">Congo</option>
      <option value="Congo the Democratic Republic of the">Democratic Republic of the Congo</option>
      <option value="Cook Islands">Cook Islands</option>
      <option value="Costa Rica">Costa Rica</option>
      <option value="Cote d'Ivoire">Cote d'Ivoire</option>
      <option value="Croatia">Croatia</option>
      <option value="Cuba">Cuba</option>
      <option value="Curacao">Curacao</option>
      <option value="Cyprus">Cyprus</option>
      <option value="Czech Republic">Czech Republic</option>
      <option value="Denmark">Denmark</option>
      <option value="Djibouti">Djibouti</option>
      <option value="Dominica">Dominica</option>
      <option value="Dominican Republic">Dominican Republic</option>
      <option value="Ecuador">Ecuador</option>
      <option value="Egypt">Egypt</option>
      <option value="El Salvador">El Salvador</option>
      <option value="Equatorial Guinea">Equatorial Guinea</option>
      <option value="Eritrea">Eritrea</option>
      <option value="Estonia">Estonia</option>
      <option value="Ethiopia">Ethiopia</option>
      <option value="Falkland Islands (Malvinas)">Falkland Islands (Malvinas)</option>
      <option value="Faroe Islands">Faroe Islands</option>
      <option value="Fiji">Fiji</option>
      <option value="Finland">Finland</option>
      <option value="France">France</option>
      <option value="French Guiana">French Guiana</option>
      <option value="French Polynesia">French Polynesia</option>
      <option value="French Southern Territories">French Southern Territories</option>
      <option value="Gabon">Gabon</option>
      <option value="Gambia">Gambia</option>
      <option value="Georgia">Georgia</option>
      <option value="Germany">Germany</option>
      <option value="Ghana">Ghana</option>
      <option value="Gibraltar">Gibraltar</option>
      <option value="Greece">Greece</option>
      <option value="Greenland">Greenland</option>
      <option value="Grenada">Grenada</option>
      <option value="Guadeloupe">Guadeloupe</option>
      <option value="Guam">Guam</option>
      <option value="Guatemala">Guatemala</option>
      <option value="Guernsey">Guernsey</option>
      <option value="Guinea">Guinea</option>
      <option value="Guinea-Bissau">Guinea-Bissau</option>
      <option value="Guyana">Guyana</option>
      <option value="Haiti">Haiti</option>
      <option value="Heard Island and McDonald Islands">Heard Island and McDonald Islands</option>
      <option value="Holy See (Vatican City State)">Holy See (Vatican City State)</option>
      <option value="Honduras">Honduras</option>
      <option value="Hong Kong">Hong Kong</option>
      <option value="Hungary">Hungary</option>
      <option value="Iceland">Iceland</option>
      <option value="India">India</option>
      <option value="Indonesia">Indonesia</option>
      <option value="Iran">Iran</option>
      <option value="Iraq">Iraq</option>
      <option value="Ireland">Ireland</option>
      <option value="Isle of Man">Isle of Man</option>
      <option value="Israel">Israel</option>
      <option value="Italy">Italy</option>
      <option value="Jamaica">Jamaica</option>
      <option value="Japan">Japan</option>
      <option value="Jersey">Jersey</option>
      <option value="Jordan">Jordan</option>
      <option value="Kazakhstan">Kazakhstan</option>
      <option value="Kenya">Kenya</option>
      <option value="Kiribati">Kiribati</option>
      <option value="Korea, Republic of">Korea</option>
      <option value="Kosovo">Kosovo</option>
      <option value="Kuwait">Kuwait</option>
      <option value="Kyrgyzstan">Kyrgyzstan</option>
      <option value="Lao People's Democratic Republic">Lao People's Democratic Republic</option>
      <option value="Latvia">Latvia</option>
      <option value="Lebanon">Lebanon</option>
      <option value="Lesotho">Lesotho</option>
      <option value="Liberia">Liberia</option>
      <option value="Libyan Arab Jamahiriya">Libyan Arab Jamahiriya</option>
      <option value="Liechtenstein">Liechtenstein</option>
      <option value="Lithuania">Lithuania</option>
      <option value="Luxembourg">Luxembourg</option>
      <option value="Macao">Macao</option>
      <option value="Macedonia, the Former Yugoslav Republic of">Republic of Macedonia</option>
      <option value="Madagascar">Madagascar</option>
      <option value="Malawi">Malawi</option>
      <option value="Malaysia">Malaysia</option>
      <option value="Maldives">Maldives</option>
      <option value="Mali">Mali</option>
      <option value="Malta">Malta</option>
      <option value="Marshall Islands">Marshall Islands</option>
      <option value="Martinique">Martinique</option>
      <option value="Mauritania">Mauritania</option>
      <option value="Mauritius">Mauritius</option>
      <option value="Mayotte">Mayotte</option>
      <option value="Mexico">Mexico</option>
      <option value="Micronesia, Federated States of">Federated States of Micronesia</option>
      <option value="Moldova, Republic of">Republic of Moldova</option>
      <option value="Monaco">Monaco</option>
      <option value="Mongolia">Mongolia</option>
      <option value="Montenegro">Montenegro</option>
      <option value="Montserrat">Montserrat</option>
      <option value="Morocco">Morocco</option>
      <option value="Mozambique">Mozambique</option>
      <option value="Myanmar">Myanmar</option>
      <option value="Namibia">Namibia</option>
      <option value="Nauru">Nauru</option>
      <option value="Nepal">Nepal</option>
      <option value="Netherlands">Netherlands</option>
      <option value="Netherlands Antilles">Netherlands Antilles</option>
      <option value="New Caledonia">New Caledonia</option>
      <option value="New Zealand">New Zealand</option>
      <option value="Nicaragua">Nicaragua</option>
      <option value="Niger">Niger</option>
      <option value="Nigeria">Nigeria</option>
      <option value="Niue">Niue</option>
      <option value="Norfolk Island">Norfolk Island</option>
      <option value="Northern Mariana Islands">Northern Mariana Islands</option>
      <option value="Norway">Norway</option>
      <option value="Oman">Oman</option>
      <option value="Pakistan">Pakistan</option>
      <option value="Palau">Palau</option>
      <option value="Palestinian Territory, Occupied">Palestinian Territory</option>
      <option value="Panama">Panama</option>
      <option value="Papua New Guinea">Papua New Guinea</option>
      <option value="Paraguay">Paraguay</option>
      <option value="Peru">Peru</option>
      <option value="Philippines">Philippines</option>
      <option value="Pitcairn">Pitcairn</option>
      <option value="Poland">Poland</option>
      <option value="Portugal">Portugal</option>
      <option value="Puerto Rico">Puerto Rico</option>
      <option value="Qatar">Qatar</option>
      <option value="Reunion">Reunion</option>
      <option value="Romania">Romania</option>
      <option value="Russian Federation">Russian Federation</option>
      <option value="Rwanda">Rwanda</option>
      <option value="Saint Barthelemy">Saint Barthelemy</option>
      <option value="Saint Helena">Saint Helena</option>
      <option value="Saint Kitts and Nevis">Saint Kitts and Nevis</option>
      <option value="Saint Lucia">Saint Lucia</option>
      <option value="Saint Martin (French part)">Saint Martin</option>
      <option value="Saint Pierre and Miquelon">Saint Pierre and Miquelon</option>
      <option value="Saint Vincent and the Grenadines">Saint Vincent and the Grenadines</option>
      <option value="Samoa">Samoa</option>
      <option value="San Marino">San Marino</option>
      <option value="Sao Tome and Principe">Sao Tome and Principe</option>
      <option value="Saudi Arabia">Saudi Arabia</option>
      <option value="Senegal">Senegal</option>
      <option value="Serbia">Serbia</option>
      <option value="Seychelles">Seychelles</option>
      <option value="Sierra Leone">Sierra Leone</option>
      <option value="Singapore">Singapore</option>
      <option value="Sint Maarten">Sint Maarten</option>
      <option value="Slovakia">Slovakia</option>
      <option value="Slovenia">Slovenia</option>
      <option value="Solomon Islands">Solomon Islands</option>
      <option value="Somalia">Somalia</option>
      <option value="South Africa">South Africa</option>
      <option value="South Georgia and the South Sandwich Islands">South Georgia and the South Sandwich Islands</option>
      <option value="South Sudan">South Sudan</option>
      <option value="Spain">Spain</option>
      <option value="Sri Lanka">Sri Lanka</option>
      <option value="Sudan">Sudan</option>
      <option value="Suriname">Suriname</option>
      <option value="Svalbard and Jan Mayen">Svalbard and Jan Mayen</option>
      <option value="Swaziland">Swaziland</option>
      <option value="Sweden">Sweden</option>
      <option value="Switzerland">Switzerland</option>
      <option value="Syria">Syria</option>
      <option value="Taiwan">Taiwan</option>
      <option value="Tajikistan">Tajikistan</option>
      <option value="Tanzania, United Republic of">United Republic of Tanzania</option>
      <option value="Thailand">Thailand</option>
      <option value="Timor-Leste">Timor-Leste</option>
      <option value="Togo">Togo</option>
      <option value="Tokelau">Tokelau</option>
      <option value="Tonga">Tonga</option>
      <option value="Trinidad and Tobago">Trinidad and Tobago</option>
      <option value="Tunisia">Tunisia</option>
      <option value="Turkey">Turkey</option>
      <option value="Turkmenistan">Turkmenistan</option>
      <option value="Turks and Caicos Islands">Turks and Caicos Islands</option>
      <option value="Tuvalu">Tuvalu</option>
      <option value="Uganda">Uganda</option>
      <option value="Ukraine">Ukraine</option>
      <option value="United Arab Emirates">United Arab Emirates</option>
      <option value="United Kingdom">United Kingdom</option>
      <option value="United States Minor Outlying Islands">United States Minor Outlying Islands</option>
      <option value="Uruguay">Uruguay</option>
      <option value="Uzbekistan">Uzbekistan</option>
      <option value="Vanuatu">Vanuatu</option>
      <option value="Venezuela">Venezuela</option>
      <option value="Viet Nam">Viet Nam</option>
      <option value="Virgin Islands, British">Virgin Islands, British</option>
      <option value="Virgin Islands, U.S.">Virgin Islands, U.S.</option>
      <option value="Wallis and Futuna">Wallis and Futuna</option>
      <option value="Yemen">Yemen</option>
      <option value="Zambia">Zambia</option>
      <option value="Zimbabwe">Zimbabwe</option>
    </select>
  </div>
  <div class="marketo-form-field">
    <label for="License_Count__c" class="mrkto_select_lbl">How many licenses will you need?<span class="requiredAsterix">*</span></label>
    <select id="1298_License_Count__c" class="mrkto_select" name="License_Count__c" required="" oninvalid="setCustomValidity('This field is required.)" oninput="setCustomValidity('')">
      <option value="">Select...</option>
      <option value="1">1 User</option>
      <option value="2">2 to 10</option>
      <option value="11">11 to 20</option>
      <option value="21">21 to 50</option>
      <option value="51">51+</option>
    </select>
  </div>
  <div class="marketo-form-field">
    <span>By filling out this form and clicking submit, you acknowledge our<span>&nbsp;</span></span><a href="https://www.pluralsight.com/privacy" target="_blank">privacy policy</a><span>.</span>
  </div>
  <div class="marketo-form-field">
    <input type="hidden" id="1298_UTM_Source__c" class="mrkto_hidden" name="UTM_Source__c">
  </div>
  <div class="marketo-form-field">
    <input type="hidden" id="1298_UTM_Medium__c" class="mrkto_hidden" name="UTM_Medium__c">
  </div>
  <div class="marketo-form-field">
    <input type="hidden" id="1298_UTM_Campaign__c" class="mrkto_hidden" name="UTM_Campaign__c">
  </div>
  <div class="marketo-form-field">
    <input type="hidden" id="1298_UTM_Content__c" class="mrkto_hidden" name="UTM_Content__c">
  </div>
  <div class="marketo-form-field">
    <input type="hidden" id="1298_UTM_Term__c" class="mrkto_hidden" name="UTM_Term__c">
  </div>
  <div class="marketo-form-field">
    <input type="hidden" id="1298_mcvisid__c" class="mrkto_hidden" name="mcvisid__c">
  </div>
  <div class="marketo-form-field">
    <input type="hidden" id="1298_GCLID__c" class="mrkto_hidden" name="GCLID__c">
  </div>
  <div class="marketo-form-field">
    <input type="hidden" id="1298_Electronic_Person__c" class="mrkto_hidden" name="Electronic_Person__c">
  </div>
  <div class="marketo-form-field">
    <button type="submit" class="mrkto_submit">Submit</button>
    <input type="hidden" name="formid" value="1298">
  </div>
</form>

<form id="customMarketo_1041" data-mkto-id="1041">
  <div class="marketo-form-field">
    <label for="Email" class="mrkto_text_lbl">Email Address:<span class="requiredAsterix">*</span></label>
    <input type="email" id="1041_Email" class="mrkto_email" name="Email" required="" oninvalid="setCustomValidity('Must be valid email. example@yourdomain.com)" oninput="setCustomValidity('')" maxlength="255">
  </div>
  <div class="marketo-form-field">
    <input type="hidden" id="1041_UTM_Source__c" class="mrkto_hidden" name="UTM_Source__c">
  </div>
  <div class="marketo-form-field">
    <input type="hidden" id="1041_UTM_Medium__c" class="mrkto_hidden" name="UTM_Medium__c">
  </div>
  <div class="marketo-form-field">
    <input type="hidden" id="1041_UTM_Campaign__c" class="mrkto_hidden" name="UTM_Campaign__c">
  </div>
  <div class="marketo-form-field">
    <input type="hidden" id="1041_UTM_Content__c" class="mrkto_hidden" name="UTM_Content__c">
  </div>
  <div class="marketo-form-field">
    <input type="hidden" id="1041_UTM_Term__c" class="mrkto_hidden" name="UTM_Term__c">
  </div>
  <div class="marketo-form-field">
    <input type="hidden" id="1041_mcvisid__c" class="mrkto_hidden" name="mcvisid__c">
  </div>
  <div class="marketo-form-field">
    <input type="hidden" id="1041_GCLID__c" class="mrkto_hidden" name="GCLID__c">
  </div>
  <div class="marketo-form-field">
    <input type="hidden" id="1041_Electronic_Person__c" class="mrkto_hidden" name="Electronic_Person__c">
  </div>
  <div class="marketo-form-field">
    <input type="checkbox" id="1041_Single_Opt_In__c" class="mrkto_checkbox" name="Single_Opt_In__c" value="yes">
    <label for="1041_Single_Opt_In__c" class="mrkto_checkbox_lbl">I would like to receive emails from Pluralsight</label>
  </div>
  <div class="marketo-form-field">
    <button type="submit" class="mrkto_submit">Submit</button>
    <input type="hidden" name="formid" value="1041">
  </div>
</form>

Text Content

Skip to content
 * Pluralsight
 * Skills
 * A Cloud Guru
 * Flow
 * Blog


An avatar icon Sign in
 * A skills logo
   
   Sign in to Skills
   
   The Skills product logo icon
   
 * A Cloud Guru small logo icon
   
   Sign in to A Cloud Guru
   
   A Cloud Guru logo, color version
   
 * Flow product logo
   
   Sign in to Flow
   
   The Flow product logo icon
   

The Pluralsight logo, color version
 * Explore
 * Software dev
 * Cloud
 * IT Ops
 * Data
 * Security
 * Leadership

 * A search magnifying glass icon
   A search magnifying glass icon
   
 * Contact sales
 * View plans

Close Icon

Sign in Menu
 *  * A skills logo
      
      Sign in to Skills
      
      The Skills product logo icon
      
    * A Cloud Guru small logo icon
      
      Sign in to A Cloud Guru
      
      A Cloud Guru logo, color version
      
    * Flow product logo
      
      Sign in to Flow
      
      The Flow product logo icon
      

 *  * Pluralsight
    * Skills
    * A Cloud Guru
    * Flow
    * Blog

A search magnifying glass
 * Explore
 * Software dev
 * Cloud
 * IT Ops
 * Data
 * Security
 * Leadership

 * Contact sales
 * View plans


CONTACT SALES

First Name*
Last Name*
Email Address*
Company*
Job Title*
Phone*
Country* Select... United States Afghanistan Aland Islands Albania Algeria
American Samoa Andorra Angola Anguilla Antarctica Antigua and Barbuda Argentina
Armenia Aruba Australia Austria Azerbaijan Bahamas Bahrain Bangladesh Barbados
Belarus Belgium Belize Benin Bermuda Bhutan Bolivia Bonaire, Saint Eustatius and
Saba Bosnia and Herzegovina Botswana Bouvet Island Brazil British Indian Ocean
Territory Brunei Darussalam Bulgaria Burkina Faso Burundi Cambodia Cameroon
Canada Cape Verde Cayman Islands Central African Republic Chad Chile China
Christmas Island Cocos (Keeling) Islands Colombia Comoros Congo Democratic
Republic of the Congo Cook Islands Costa Rica Cote d'Ivoire Croatia Cuba Curacao
Cyprus Czech Republic Denmark Djibouti Dominica Dominican Republic Ecuador Egypt
El Salvador Equatorial Guinea Eritrea Estonia Ethiopia Falkland Islands
(Malvinas) Faroe Islands Fiji Finland France French Guiana French Polynesia
French Southern Territories Gabon Gambia Georgia Germany Ghana Gibraltar Greece
Greenland Grenada Guadeloupe Guam Guatemala Guernsey Guinea Guinea-Bissau Guyana
Haiti Heard Island and McDonald Islands Holy See (Vatican City State) Honduras
Hong Kong Hungary Iceland India Indonesia Iran Iraq Ireland Isle of Man Israel
Italy Jamaica Japan Jersey Jordan Kazakhstan Kenya Kiribati Korea Kosovo Kuwait
Kyrgyzstan Lao People's Democratic Republic Latvia Lebanon Lesotho Liberia
Libyan Arab Jamahiriya Liechtenstein Lithuania Luxembourg Macao Republic of
Macedonia Madagascar Malawi Malaysia Maldives Mali Malta Marshall Islands
Martinique Mauritania Mauritius Mayotte Mexico Federated States of Micronesia
Republic of Moldova Monaco Mongolia Montenegro Montserrat Morocco Mozambique
Myanmar Namibia Nauru Nepal Netherlands Netherlands Antilles New Caledonia New
Zealand Nicaragua Niger Nigeria Niue Norfolk Island Northern Mariana Islands
Norway Oman Pakistan Palau Palestinian Territory Panama Papua New Guinea
Paraguay Peru Philippines Pitcairn Poland Portugal Puerto Rico Qatar Reunion
Romania Russian Federation Rwanda Saint Barthelemy Saint Helena Saint Kitts and
Nevis Saint Lucia Saint Martin Saint Pierre and Miquelon Saint Vincent and the
Grenadines Samoa San Marino Sao Tome and Principe Saudi Arabia Senegal Serbia
Seychelles Sierra Leone Singapore Sint Maarten Slovakia Slovenia Solomon Islands
Somalia South Africa South Georgia and the South Sandwich Islands South Sudan
Spain Sri Lanka Sudan Suriname Svalbard and Jan Mayen Swaziland Sweden
Switzerland Syria Taiwan Tajikistan United Republic of Tanzania Thailand
Timor-Leste Togo Tokelau Tonga Trinidad and Tobago Tunisia Turkey Turkmenistan
Turks and Caicos Islands Tuvalu Uganda Ukraine United Arab Emirates United
Kingdom United States Minor Outlying Islands Uruguay Uzbekistan Vanuatu
Venezuela Viet Nam Virgin Islands, British Virgin Islands, U.S. Wallis and
Futuna Yemen Zambia Zimbabwe
How many licenses will you need?* Select... 1 User 2 to 10 11 to 20 21 to 50 51+
By filling out this form and clicking submit, you acknowledge our privacy
policy.








Submit

Thank you!

Close button icon

 1. Blog
 2. Blog


HOW TO THROW AN EXCEPTION IN JAVA

A step-by-step guide with code examples on how to use Java's error-handling
technique, differentiate between checked and unchecked exceptions, and more.

By Josh Cummings

Dec 06, 2023 • 12 Minute Read


 * Software Development
 * Product & UX

--------------------------------------------------------------------------------

Subscribe to the newsletter

“Yes! My application finally works!” I hear you say. I know you’ve said it at
some point --- accompanied by a huge rush of endorphins, validation, and relief
--- because I’ve said it myself hundreds of times over my 25 years as a Java
coder. In fact, if it’s a particularly tricky problem, it’s not uncommon for me
to hoot, cheer, and even stand and do a few finger snaps to celebrate (I work
remotely).

But many times when we say “it works!”, we are really saying that we’ve got the
“happy path” done. We’ve accounted for how things will work only if our end user
makes no mistakes and our application has infinite resources and zero bugs. We
ultimately know this isn’t true, but it’s nice to live in denial momentarily.

The truth is that often more than half the battle is error-handling. In Java’s
case, that means exceptions.


THE HAPPY PATH VS THE RIGHT ONE

Let’s consider the following Java application that asks an end user for two
numbers and divides them:

      java
public class Divider {
    public static void main(String… args) {
        Console console = System.console();
        Double numerator = Double.valueOf(console.readLine(“Enter the numerator: “));
        Double denominator = Double.valueOf(console.readLine(“Enter the denominator: “));
        Double quotient = numerator / denominator;
        System.out.printf(“The quotient is %f%n”, quotient);
    }
}

    

The happy path works just fine:

      bash
Enter the numerator: 3.2
Enter the denominator: 1.6
The quotient is: 2.000000
    

Can you think of anything that could go wrong with this application? Pause and
see how many things you can come up with.

Did you find anything? Here are a few:

 * The user could enter something that’s not a number, resulting in a
   `NumberFormatException`

 * The user could enter a zero for the denominator, resulting in an
   `ArithmeticException`, and

 * `System#console` could return `null` if there is no console available,
   resulting in a `NullPointerException`

In this article, we’ll examine the first two of these.


THE BASICS OF ERROR HANDLING IN JAVA

If you take a look at the JavaDoc for `Double#valueOf`, you’ll see the following
explanation:

      Throws:
NumberFormatException - if the string cannot be parsed as an integer.
    

With that information in mind, you should be able to recognize what’s happening
in this run of `Divider`:

      bash
Enter the numerator: the numerator
Exception in thread "main" java.lang.NumberFormatException: For input string: "the numerator"
    at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
    at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
    at java.base/java.lang.Double.parseDouble(Double.java:651)
    at java.base/java.lang.Double.valueOf(Double.java:614)
    at com.pluralsight.joshcummings.Divider.main(Divider.java:8)

    

When the user entered an invalid input, `Double#valueOf` threw an exception.

And, as a result, the program didn’t proceed any further. This is because
exceptions interrupt the natural flow of an application. The program cannot
proceed further since it is now in an invalid state.

You can also see that while exceptions protect an application from being in an
invalid state, not handling them means an ugly and confusing experience for your
user.

What you are seeing right now is the exception and its stack trace, or the exact
line where the exception was thrown followed by the series of method calls that
led to that line. This is helpful for debugging purposes, but not likely helpful
to your end user.


HOW TO HANDLE EXCEPTIONS IN JAVA

We can improve this situation by handling the exception. Consider an improved
version of `readLine` that keeps asking the user until they provide valid input:

      java
private static Double readDouble(Console console, String message) {
    while (true) {
        Double value = Double.valueOf(console.readLine(message));
        if (value is valid) {
            return value;
        } else {
            System.err.println(“Sorry, that input was invalid, please try again”);
        }
    }
}

    

The above pseudocode handles the error by checking and then looping to ask
again. In Java, the way to do this is by catching the exception, like so:

      java
private static Double readDouble(Console console, String message) {
    while (true) {
        try {
return Double.valueOf(console.readLine(message));
        } catch (NumberFormatException ex) {
            System.err.println(“Sorry, that input was invalid, please try again”);
        }
    }
}

    

Then, we can change the original `main` method to look like this:

      java
public class Divider {
    public static void main(String… args) {
        Console console = System.console();
        Double numerator = readDouble(console, “Enter the numerator: “);
        Double denominator = readDouble(console, “Enter the denominator: “);
        Double quotient = numerator / denominator;
        System.out.printf(“The quotient is %f%n”, quotient);
    }
}

    

And the ensuing behavior is much more user-friendly and resilient:

      bash
Enter the numerator: the numerator
Sorry, that input was invalid, please try again.
Enter the numerator: 3.2
Enter the denominator: …

    


HOW TO COMMUNICATE USER ERROR

We can use this same principle to our advantage when we want to interrupt the
flow of the application ourselves.


For example, let’s now add a dedicated `divide` method to address the
divide-by-zero issue. It might look something like this:

      java
private static Double divide(Double numerator, Double denominator) {
    if (denominator == 0) {
        return null;
    }
    return numerator / denominator;
}

    

This is an example of handling an error by returning a sentinel value. While
this does prevent the application from entering into an invalid state, it has
the potential drawback of not interrupting application flow. Such an application
would behave like this:

      java
Enter the numerator: 12
Enter the denominator: 0
The quotient is null

    

In our case, we’d prefer to not proceed with the rest of the application since
the input is invalid. So, instead of returning a sentinel value, let’s throw
Java’s `ArithmeticException`, providing a helpful message in the process:

      java
private static Double divide(Double numerator, Double denominator) {
    if (denominator == 0) {
        throw new ArithmeticException(“Sorry, you cannot divide by zero.”);
    }
    return numerator / denominator;
}

    

And then, you guessed it, we need to handle it so that the end user sees that
helpful message instead of a confusing stack trace like so:

      java
public class Divider {
    public static void main(String… args) {
        Console console = System.console();
        Double numerator = readDouble(console, “Enter the numerator: “);
        Double denominator = readDouble(console, “Enter the denominator: “);
        try {
            Double quotient = divide(numerator, denominator);
            System.out.printf(“The quotient is %f%n”, quotient);
        } catch (ArithmeticException ex) {
            System.err.println(ex.getMessage());
        }
    }
}

    

Next, let’s enhance the `divide` method in the following two ways:

 * Make the error case self-documenting

 * Add a custom exception for additional clarity


HOW TO DOCUMENT EXCEPTIONS

As you know, a method signature states what inputs are needed and what output
can be expected when you invoke the method. It can also describe what exceptions
it might throw.

If you change the `divide` method signature to this:

      java
private Double divide(Double numerator, Double denominator) throws ArithmeticException

    

This helps clarify to coders and IDEs alike what the potential hazards of your
method are without having to inspect the method body (which they may not have
access to anyway).

Now, there are a lot more exceptions that a given method might throw that have
nothing precisely to do with your business logic. A famous one is
`NullPointerException`, which is an exception that Java throws whenever you try
and operate on a null reference. Others like this are `IllegalArgumentException`
and `IllegalStateException`. Stating these in the method signature doesn’t
provide more information about the kinds of errors that might occur. Because of
that, it’s not helpful to add them to the method signature.


But, whenever the exception is an important expression of business logic, you
should place it in your method signature for clarity.


HOW TO THROW CUSTOM EXCEPTIONS

Let’s illustrate this principle further by creating a custom exception. An
exception is just a Java class, which means that it can be extended. Usually,
exceptions are extended for two reasons:

 * Different types can be placed in different catch blocks

 * The extension’s class name is clearer about what went wrong

To see the second one in action, consider the following custom exception that
extends `ArithmeticException`:

      java
public class DivideByZeroException extends ArithmeticException {
    public DivideByZeroException() {
        super(“Sorry, you cannot divide by zero.”);
    }
}
    

Having done this, we can change the divide method like so:

      java
private static Double divide(Double numerator, Double denominator) throws DivideByZeroException {
    if (denominator == 0) {
        throw new DivideByZeroException();
    }
    return numerator / denominator;
}
    

You’ll notice two changes. First, we throw our custom exception. Second, our
method signature is more descriptive as to what could go wrong.

Now you know enough to do something a bit more advanced! Let’s make another
change to our application to illustrate how throwing an exception affects the
programming flow and some related best practices around checked and unchecked
exceptions.


HOW TO PROPAGATE EXCEPTIONS

Let’s imagine that we introduce a method called `run`, which is going to run our
program. This could be helpful in case we want to control when it gets run and
how many times it gets run. Here’s what our new `main` and `run` methods might
look like:

      java
public static void main(String… args) {
    try {
        run();
    } catch (Exception ex) { // a trick to catch all exceptions!
        System.err.printf(“An error occurred: %s%n“, ex.getMessage());
    }
}

private static void run() {
    Console console = System.console();
    Double numerator = readDouble(console, “Enter the numerator: “);
    Double denominator = readDouble(console, “Enter the denominator: “);
    Double quotient = divide(numerator, denominator);
    System.out.printf(“The quotient is %f%n”, quotient);
}

// …
    

Notice that there is no more `catch` block around the call to `divide`. This
works since Java automatically propagates an exception up to the first `catch`
block that it finds that handles that exception or one of that exception’s
superclasses.

In other words, when our `DivideByZeroException` is thrown, Java passes it up to
the `run` method. Seeing that `run` doesn’t handle it, it goes up to the next
method in the stack trace, `main`. Seeing a `catch` block there that handles
`Exception`, a superclass of `DivideByZeroException`, Java moves the program
flow there.

You can see this by analyzing that the stacktrace changed from this:

      Exception in thread "main" com.pluralsight.joshcummings.DivideByZeroException: Sorry, you cannot divide by zero
    at sample.config.Divider.divide(Divider.java:26)
    at sample.config.Divider.main(Divider.java:10)

    

to this:

      Exception in thread "main" com.pluralsight.joshcummings.DivideByZeroException: Sorry, you cannot divide by zero
    at sample.config.Divider.divide(Divider.java:34)
    at sample.config.Divider.run(Divider.java:18)
    at sample.config.Divider.main(Divider.java:8)

    

There are times when we might want to provide more context, though, as an
exception moves up the call stack. For example, `run` might simply want to
indicate whether it was a user error or an application error.

We can propagate a lower-level exception into a higher one by including the
lower in the higher’s constructor, like so:

      java
private static void run() {
    Console console = System.console();
    Double numerator = readDouble(console, “Enter the numerator: “);
    Double denominator = readDouble(console, “Enter the denominator: “);
    try {
        Double quotient = divide(numerator, denominator);
        System.out.printf(“The quotient is %f%n”, quotient);
    } catch (DivideByZeroException lowerLevelException) {
        throw new IllegalArgumentException(lowerLevelException);
    }
}

    

Including the causing exception in the constructor ensures that all the
debugging information is preserved when you are trying to figure out later on
what caused this or that error to occur, which you can again see by the new
stack trace that includes both exceptions:

      Exception in thread "main" java.lang.IllegalArgumentException: Sorry, you cannot divide by zero
    at sample.config.Divider.run(Divider.java:22)
    at sample.config.Divider.main(Divider.java:8)
Caused by: com.pluralsight.joshcummings.DivideByZeroException: Sorry, you cannot divide by zero
    at sample.config.Divider.divide(Divider.java:38)
    at sample.config.Divider.run(Divider.java:19)
    ... 1 more

    




WHY YOU SHOULD FAVOR THROWING RUNTIME EXCEPTIONS

Now, if you’ve read anything about Java exceptions, you’ve certainly heard
someone mention that Java has both checked and unchecked exceptions.

The examples we’ve been working with so far are unchecked exceptions. It means
that your code will still compile even if an exception is not handled (caught in
a `catch` block or listed in a `throws` block). On the other hand, checked
exceptions are ones where the Java compiler checks that you handled it, or
compilation fails.

We’ll see an example in a moment. First, though, in my humble (and always
correct) opinion, unchecked exceptions are the ideal. In my 25 years as a Java
coder, I have yet to run into a situation where a checked exception would have
been preferred. Whenever I advise a junior coder who has used a checked
exception, I explain that no other programming language before or since had
checked exceptions, it is a failed experiment, and I invite them to use an
unchecked exception instead lest God kill another kitten.

Hopefully my position is clear.

When code throws a checked exception, it must be handled immediately or
compilation fails. The implications of this policy are a little clearer in
larger applications with lots of nesting. For now, though, let’s just learn the
difference.

To illustrate, let’s go back to an earlier iteration of our `run` method:

      java
private static void run() {
    Console console = System.console();
    Double numerator = readDouble(console, “Enter the numerator: “);
    Double denominator = readDouble(console, “Enter the denominator: “);
    Double quotient = divide(numerator, denominator);
    System.out.printf(“The quotient is %f%n”, quotient);
}

    

Any exception that extends from `RuntimeException` is an unchecked exception (or
an exception whose handling does not need to be dealt with until runtime). If
you look at the object hierarchy for `ArithmeticException`, you’ll see that it’s
an unchecked exception:

 * java.lang.Object
   
   * java.lang.Throwable
     
     * java.lang.Exception
       
       * java.lang.RuntimeException
         
         * java.lang.ArithmeticException

If you instead extend from `Exception`, then it is a checked exception. This
means that you are telling the compiler to fail if the calling code doesn’t
handle your exception.

For example, let’s say that our `DivideByZeroException` extended from
`Exception` instead of `ArithmeticException`:

      java
public class DivideByZeroException extends Exception

    

Now compilation will say:

      bash
com/pluralsight/joshcummings/Divider.java:18: error: unreported exception DivideByZeroException; must be caught or declared to be thrown
   		 Double quotient = divide(numerator, denominator);
    

To fix this, we need to do one of three less-than-ideal things. `run` must
either change to this:

      java
private static void run() throws DivideByZeroException {
    Console console = System.console();
    Double numerator = readDouble(console, “Enter the numerator: “);
    Double denominator = readDouble(console, “Enter the denominator: “);
    Double quotient = divide(numerator, denominator);
    System.out.printf(“The quotient is %f%n”, quotient);
}

    

... which is not ideal, since `run` certainly has nothing to do with
“arithmetic”; to this:

      java
private static void run() {
    Console console = System.console();
    Double numerator = readDouble(console, “Enter the numerator: “);
    Double denominator = readDouble(console, “Enter the denominator: “);
    try {
        Double quotient = divide(numerator, denominator);
        System.out.printf(“The quotient is %f%n”, quotient);
    } catch (DivideByZeroException ex) {
        System.err.printf(“An error occurred: %s%n“, ex.getMessage());
    }
}

    

....which is not ideal, since it duplicates error-handling logic in `main`; or
to this:

      java
private static void run() {
    Console console = System.console();
    Double numerator = readDouble(console, “Enter the numerator: “);
    Double denominator = readDouble(console, “Enter the denominator: “);
    try {
        Double quotient = divide(numerator, denominator);
        System.out.printf(“The quotient is %f%n”, quotient);
    } catch (DivideByZeroException ex) {
        throw new IllegalArgumentException(ex, ex.getMessage());
    }
}

    

...which is not ideal, since the extra boilerplate is forced on the coder
instead of allowing the coder to consider overall readability and API clarity.

In general, checked exceptions aren’t preferred since they tend to clutter up
method signatures and calling code that may not have the appropriate context to
be able to handle the exception. 


In all fairness, some have argued that checked exceptions force good API design
in the same way that Python forces clean code with mandatory indentation. It’s
conceivable that with a more concise exception-handling syntax this may be true.
However, we need only refer ourselves to tools like Lombok’s `@SneakyThrows` to
understand the Java community's general rejection of this idea.



CONCLUSION

In this article, you’ve learned about Java’s exception-handling capabilities,
specifically around throwing exceptions. The JDK itself commonly throws
exceptions to indicate invalid usage or an invalid state, and you can do the
same with the code that you write. When an exception is thrown, the program flow
moves to the closest applicable catch block in the call stack.

If you are wrapping and re-throwing an exception you’ve caught, remember to
include the original exception in the constructor so the low-level cause isn’t
lost. Finally, favor throwing unchecked exceptions as it typically makes for
more readable code.


LEARNING MORE ABOUT JAVA

If you’re keen to upgrade your Java skills, Pluralsight also offers a wide range
of Java and Spring related courses that cater to your skill level. You can sign
up for a 10-day free trial with no commitments. You can also perform an
equally free roleIQ assessment to see where your Java skills currently stack up,
with advice on where to shore up the gaps in your current skill set.

Below is a list of Pluralsight learning paths with courses for beginner,
intermediate, and advanced Java courses — just pick the starting point that
works for you. If you’re not sure where you’re at, each page has a skill
assessment you can use that will recommend where you should start out.

 * Java Coding Practices

 * Java SE 11 Developer Certification (1ZO-819)

 * Building Machine Learning Solutions with Java

And if you liked this article, here are some courses written by me that you can
check out.

 * Securing Java Web Application Data

 * Securing Java Web Applications Through Authentication

 * Secure Coding Practices in Java Applications (Java SE 11 Developer
   Certification 1Z0-819)

Josh C.

Like many software craftsmen, Josh eats, sleeps, and dreams in code. He codes
for fun, and his kids code for fun! Right now, Josh works as a full-time
committer on Spring Security and loves every minute. Application Security holds
a special place in his heart, a place diametrically opposed to and cosmically
distant from his unending hatred for checked exceptions.

More about this author



 * SUPPORT
   
   * Contact
   * Help Center
   * IP Allowlist
   * Sitemap
   * Download Pluralsight
   * Skills Plans
   * A Cloud Guru Plans
   * Flow Plans


 * COMMUNITY
   
   * Guides
   * Teach
   * Partner with Pluralsight
   * Affiliate Partners
   * Pluralsight One
   * Authors


 * COMPANY
   
   * About Us
   * Careers
   * Newsroom
   * Resources


 * INDUSTRIES
   
   * Education
   * Financial Services (FSBI)
   * Healthcare
   * Insurance
   * Non-Profit
   * Public Sector


 * NEWSLETTER
   
   Email Address:*
   
   
   
   
   
   
   
   
   I would like to receive emails from Pluralsight
   Submit
   
   Thank you!
   
   * A facebook icon
   * 
   * 
   * 
   * 

--------------------------------------------------------------------------------

Pluralsight logo Copyright © 2004 - 2024 Pluralsight LLC. All rights reserved
 * Terms of Use
 * Privacy Notice
 * Modern Slavery Statement