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
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> </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