Java-异常处理(编译时异常、运行时异常及处理机制,自定义异常)

article/2025/10/1 10:42:49

个人简介

  • 大家好,我是翰慧腾。一名正在努力学JAVA的大一小白,本文章为初学的笔记,希望各位多多指教。💙
  • 欢迎点赞+收藏+留言💜
  • 你要批评指点四周风景,首先你要爬上屋顶🧡

一、异常

概述:异常是程序在“编译”或者“执行”的过程中可能出现的问题。(语法错误不算在异常体系中

常见的异常:数组索引越界、空指针异常、日期格式化异常等。

  • 异常一旦出现了,如果没有提前处理,程序就会退出JVM虚拟机而终止
  • 研究异常并且避免异常,然后提前处理异常,体现的是程序的安全、健壮性。

注意:Error是系统级别问题、JVM退出等,代码无法控制。

Exception:java.lang包下,称为异常类,表示程序本身可以处理的问题

RuntimeException及其子类:运行时异常,编译阶段不会报错。(数组索引越界、空指针异常)

除RuntimeException之外所有的异常:编译时异常,编译期必须处理,否则程序不能通过编译。(日期格式化异常)

二、运行时异常

概述:直接继承自 RuntimeException或者其子类,编译阶段不会报错,运行时可能出现错误;通常是程序员业务没有考虑好或者是编程逻辑不严谨引起的程序错误。(说得直白点就是程序员技术不行导致的~~)

常见的运行时异常:

 

/*** @author hanhan* date 2022/4/24 8:48* 努力已经来不及了,你得拼命*/
public class ExceptionDemo {public static void main(String[] args) {//数组索引越界异常ArrayIndexOutOfBoundsExceptionint[] arr={1,2,3,4};System.out.println(arr[4]);//下标越界//空指针异常NullPointerException 直接输出没有问题,但是调用空指针的变量的功能就会报错String s=null;System.out.println(s);//不会出现异常,可以直接输出System.out.println(s.length());//字符串s本身都不知道自己指向哪,所以求长度更是不可能的//类型转换异常 ClassCastExceptionObject o=123;String s1=(String) o;//运行错误,程序终止System.out.println(s1);//数学操作异常 ArithmeticExceptionint i=10/0;System.out.println(i);//数字转换异常 NumberFormatExceptionString s2="123aa";Integer ii=Integer.valueOf(s2);System.out.println(ii);}
}

三、编译时异常

概述:不是RuntimeException或者其子类的异常,编译阶段就会报错,必须处理,否则代码不通过,不能运行。

编译时异常作用:是担心程序员的技术不行,在编译阶段就爆出一个错误,目的在于提醒不要出错。(感谢编译时异常)

                                   

四、异常的默认处理流程

 

默认的异常处理机制并不友好,一旦真正出现异常,程序立即死亡。 

五 、编译时异常的处理机制

编译时异常是编译阶段就出错的,所以必须处理,否则代码根本无法通过。

 

异常处理方式1——throws

  • 用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者处理。
  • 该方式并不友好,发现异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡 
  • 该方法可能显示抛出多个异常,但实际上只会抛出第一个异常,因为当第一个异常抛出去后,最终抛到虚拟机就会使程序死亡
  • 建议直接抛出exception

 

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;/*** @author hanhan* date 2022/4/24 9:18* 努力已经来不及了,你得拼命*/
public class ExceptionDemo_01 {public static void main(String[] args) throws ParseException {System.out.println("~~~~~start");parseTime("2022-02-22 12:12:12");System.out.println("~~~~~~end");}public static void parseTime(String data) throws ParseException {SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d=s.parse(data);System.out.println(d);}
}

异常处理方式2——try……catch……

  • 监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理
  • 基于方式一,该方法出现异常后并不会导致程序死亡(还是挺友好的),发现异常的方法自己独立完成异常的处理,程序可以继续往下执行
  • 建议catch(Exception e),直接抛出exception

 

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;/*** @author hanhan* date 2022/4/24 9:18* 努力已经来不及了,你得拼命*/
public class ExceptionDemo_01 {public static void main(String[] args) {System.out.println("~~~~~start");parseTime("2022-02-22 12:12:12");System.out.println("~~~~~~end");}public static void parseTime(String data) {try {SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d=s.parse(data);System.out.println(d);} catch (ParseException e) {System.out.println("出现了异常哦~~");}}
}

异常的处理方式3——前两者结合

  • 在开发中按照规范来说第三种方式是最好的:底层的异常抛出去给最外层,最外层集中捕获处理。
import java.text.SimpleDateFormat;
import java.util.Date;/*** @author hanhan* date 2022/4/24 9:18* 努力已经来不及了,你得拼命*/
public class ExceptionDemo_01 {public static void main(String[] args) {System.out.println("~~~~~start");try {parseTime("2022-02-22 12:12:12");} catch (Exception e) {e.printStackTrace();}System.out.println("~~~~~~end");}public static void parseTime(String data) throws Exception {SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d=s.parse(data);System.out.println(d);}}

六、运行时异常处理机制

  • 运行时异常编译阶段不会出现错误,是运行时候才可能出错的,所以编译阶段不处理也可以。
  • 按照规范建议还是处理:建议在最外层调用处集中捕获处理即可
/*** @author hanhan* date 2022/4/24 11:02* 努力已经来不及了,你得拼命* 运行时异常处理机制*/
public class Exception_02 {public static void main(String[] args) {//建议在最外层try catch一下,就算出现异常程序也不会死亡System.out.println("~~~start");try {chu(10,0);} catch (Exception e) {e.printStackTrace();//打印异常信息}System.out.println("~~~~end");}public static void chu(int a,int b){System.out.println(a);System.out.println(b);int c=a/b;System.out.println(c);}
}

七、案例

import java.util.Scanner;/*** @author hanhan* date 2022/4/24 11:22* 努力已经来不及了,你得拼命* 感受异常功能的强大*/
public class Exception_Case {public static void main(String[] args) {Scanner sc=new Scanner(System.in);while(true){try {System.out.println("请输入价格:");String s=sc.nextLine();double d=Double.valueOf(s);if(d>0){System.out.println("价格为"+d);break;}else {System.out.println("您输入价格不合理。请重新输入");}} catch (NumberFormatException e) {System.out.println("您输入信息有误,请重新输入");}}}
}

 八、自定义异常

自定义异常好处:

  • 可以使用异常的机制管理业务问题,如提醒程序员注意。
  • 同时一旦出现bug,可以用异常的形式清晰的指出出现错误的地方

自定义编译时异常:编译时异常是编译阶段就报错,提醒更加强烈,一定需要处理

  • 定义一个类继承Exception
  • 重写构造器
  • 在出现异常的地方用throw new 自定义抛出

throw和throws:

throws:用在方法声明上的,抛出方法内部的异常

throw:在方法内部直接创建一个异常对象,并抛出

​
​
/*** @author hanhan* date 2022/4/24 11:35* 努力已经来不及了,你得拼命* 自定义编译时异常*/
public class ExceptionDemo_03 {public static void main(String[] args) {try {checkAge(12);} catch (AgeException e) {e.printStackTrace();}}public static void checkAge(int age) throws AgeException {if(age<=0||age>100){//抛出异常对象给调用者throw new AgeException(age+"是不正确的");}else{System.out.println("年龄正确");}}
}
class AgeException extends Exception{public AgeException() {}public AgeException(String message) {super(message);}
}​​

自定义运行时异常:提醒不强烈,编译阶段不报错,运行时才可能出现

  • 定义一个异常类继承RuntimeException类
  • 重写构造器
  • 在出现异常的地方用throw new自定义对象抛出
/*** @author hanhan* date 2022/4/24 15:24* 努力已经来不及了,你得拼命* 自定义运行时异常*/
public class ExceptionDemo_04 {public static void main(String[] args) {try {checkAge(-12);} catch (Exception e) {System.out.println("您输入年龄有误");}}public static void checkAge(int age) {if(age<=0||age>100){//抛出异常对象给调用者throw new AgeException_(age+"是不正确的");}else{System.out.println("年龄正确");}}
}
class AgeException_ extends RuntimeException{public AgeException_() {}public AgeException_(String message) {super(message);}
}


http://chatgpt.dhexx.cn/article/1ie2Z3py.shtml

相关文章

通俗理解运行时异常和非运行时异常(一般异常)

一&#xff0c;异常的概念 Java异常类层次结构图&#xff1a; Throwable&#xff1a; 有两个重要的子类&#xff1a;Exception&#xff08;异常&#xff09;和 Error&#xff08;错误&#xff09;&#xff0c;二者都是 Java 异常处理的重要子类&#xff0c;各自都包含大量子类…

运行时异常与检查异常区别

首先&#xff0c;思考一个问题&#xff0c;看下面三个代码&#xff0c;当抛出异常时&#xff0c;后面的代码还会运行吗&#xff0c;是否要在异常后加上return语句&#xff1f; //代码1 public static void test() throws Exception {throw new Exception("参数越界"…

编译时异常与运行时异常

在实际开发中&#xff0c;经常会在程序编译时产生一些异常&#xff0c;必须要对这些异常进行处理&#xff0c;这种异常称为编译时异常&#xff0c;也称为checked异常。另外&#xff0c;还有一种异常是在程序运行时产生的&#xff0c;这种异常即使不编写异常处理代码&#xff0c…

异常Exception 和 运行时异常RuntimeException

文章目录 概念 概念 Java中的所有异常都来自顶级父类Throwable。 Throwable下有两个子类Exception和Error。 Error是程序无法处理的错误&#xff0c;一旦出现这个错误&#xff0c;则程序将被迫停止运行。Exception不会导致程序停止&#xff0c;又分为两个部分RunTimeExceptio…

运行时异常与检查异常

Java把异常当做对象来处理&#xff0c;并定义一个基类java.lang.Throwable作为所有异常的超类。Java中的异常分为两大类&#xff1a;错误Error和异常Exception&#xff0c;Java异常体系结构如下图所示&#xff1a; 1.Throwable Throwable类是所有异常或错误的超类&#xff0…

运行时异常和编译异常

1.概念&#xff1a; Java中将程序执行中发生的不正常情况称为异常(Exception) 2.分类 Error(错误)&#xff1a;JVM无法解决的严重问题&#xff0c;程序会崩溃&#xff0c;比如JVM系统内部错误、资源耗尽等Exception&#xff1a;因编程错误等外在因素导致的一般性问题&#xff0…

Java Exception

Java Exception ####分类 Types of Exception There are mainly two types of exceptions: checked and unchecked where error is considered as unchecked exception. The sun microsystem says there are three types of exceptions: Checked Exception Unchecked Exce…

Java运行时异常和非运行时异常

1.Java异常机制 Java把异常当做对象来处理&#xff0c;并定义一个基类java.lang.Throwable作为所有异常的超类。Java中的异常分为两大类&#xff1a;错误Error和异常Exception&#xff0c;Java异常体系结构如下图所示&#xff1a; 图片来源&#xff1a;http://blog.csdn.net/w…

jdk和jre的区别还有maven

1.关于JDK的安装和配置问题 jdk我已经安装了(版本是1.8._60的--->并且完成相关的环境的配置) 还有环境的变量都配置好了的(java_home path 都配置好了的) JDK与JRE的区别 JRE&#xff1a; Java Runtime Environment JRE可以支撑Java程序的运行&#xff0c;包括JVM虚拟机&…

jdk与jre的区别,作用详解!

jdk与jre是Java开发和运行工具&#xff01; jdk包含有jre&#xff0c;但是jre也可以单独安装 下图为jdk目录下的jre 在安装jdk分为两个步骤&#xff0c;我们是经常会将jdk与jre一起安装&#xff0c;如果混淆两个概念建议分开安装。 JRE是Java Runtime Environment的缩写&…

java jdk jre版本要一样吗a_JDK是什么?JRE是什么?JDK和JRE的区别?

原标题:JDK是什么?JRE是什么?JDK和JRE的区别? Java Runtime Environment (JRE) 包含: Java虚拟机、库函数、运行Java应用程序和Applet所必须文件 Java 2 SDK (Development Kit)包含: JRE的超集,包含编译器和调试器等用于程序开发的文件 Java运行环境的三项主要功能: n …

java面试必问:JDK和JRE的区别是什么?

前言 JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一…

JDK和JRE的区别是什么?他们都有什么作用

相信很多java的初学者都卡在了JDK和JRE这儿&#xff0c;两者到底什么区别&#xff0c; 多数都是云里雾里的。其实笔者想说的是JDK 和JRE并没有想象中那么简单。 先给大家简单地介绍下Java的各种集成开发工具&#xff1a; JDK:开发工具包 JRE:&#xff08;运行环境&#xff0…

Java之jdk与jre的区别

很多程序员已经干了一段时间java了依然不明白jdk与jre的区别。 JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK&#xff0c;它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包&#xff0c;可以包括函数库、编译程序等。 …

[JAVA学习] JDK与JRE的区别

最近在学习Python&#xff0c;安装Python IDE ——PyCharm&#xff0c;提示未安装Jave Run Time&#xff0c;于是到Oracle官网下载Jave安装包&#xff0c;发现有JDK和JRE两个版本。 JRE是Java Runtime Environment的缩写&#xff0c;顾名思义是java运行时环境&#xff0c;包含…

JDK、JRE的区别?以及相关面试题

1.JDK和JRE是java面试的基本问题。 下图是它们的直观区别&#xff0c;可从它们的面向对象、主要作用和组成部分三方面对比。其详细如下图所示&#xff1a; 2.JDK就是Java Development Kit 的英文缩写。 1). 主要面向开发人员。开发人员在软件开发时使用的SDK&#xff08;Soft…

eclipse配置jdk,jdk与jre的区别

由于某些原因&#xff0c;需要重新安装eclipse&#xff0c;当然jdk和tomcat也要重新配置&#xff0c;于是发现eclipse居然自带一个jre 了解jre和jdk 那jdk是干啥的呢我看我安装的jdk文件夹里有两个文件夹呵呵呵呵。 搜了一下原来&#xff1a;JRE(Java Runtime Enviroment)是Jav…

JDK和JRE的区别和联系

大家应该都知道JDK和JRE是什么的缩写&#xff0c;但是当面试官问道 “请用你所学的java知识&#xff0c;告诉我JDK是干什么的&#xff1f;” &#xff0c; “JRE有什么作用&#xff1f;” &#xff0c; “这两者有什么区别和联系&#xff1f;” 等问题时&#xff0c;可能就说的…

JDK和JRE的区别

JDK是 Java 语言的软件开发工具包(SDK)&#xff0c;主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心&#xff0c;它包含了JAVA的运行环境&#xff08;JVMJava系统类库&#xff09;和JAVA工具&#xff08;在JDK的安装目录下有一个jre目录&#xff0c;里…

Java一步到位!彻底了解JDK、JRE、JVM分别是什么及它们之间的联系

大多数人刚接触Java的时候都会经常看到JDK、JRE、JVM&#xff0c;但可能一直迷迷糊糊&#xff0c;不知道它们之间真正的作用和含义&#xff0c;而了解JDK、JRE、JVM分别是什么及它们之间的关系有助于我们更加深刻的理解java语言的特性。 Java程序是运行在JVM(Java虚拟机)上的&…