7.java——异常

news2025/7/11 3:11:37

异常——error(资源耗尽,JVM内部系统错误,代码一般处理不了)和excption(数组越界,空指针访问,代码可以处理)

  • java.lang.Throwable;异常体系的根父类

  • -------java.lang.Error:错误。JVM虚拟机无法解决的严重问题,jvm系统内部错误,资源耗尽
    |------StackOverflow、OutOfMemoryError
    -------java.lang.Exception:异常。我们可以编写针对性的代码进行处理

  • |——编译时异常:(受检异常)**在执行javac.exe命令时,出现的异常
    - ClassNotFoundException——没有找到对应类
    - FileNotFoundException——文件没有找到
    - IOException——文件读写异常

  • |——运行时的异常:(非受检异常)**在执行java.exe命令时,出现的异常tE
    - ArrayIndexOutBoundsException——数组越界
    - NullPointerException——指针空指向
    - ClassCastException——类型转换异常
    - NumberFormatException——数据格式输入异常
    - InputMismatchException——输入不一致异常
    - ArithmeticException——算术异常

public void test8()
{           ClassNotFoundException
    Class clz=Class.forName("java.lang.Stirng");
}

public void test9()
{
    File file =new File("hello.txt");
    FileInputStream fis =new FileInputStream(file);  //FileNotFoundException——文件没有找到
    
    int data =fis.read();//IOException——文件读写异常
    while(data !=-1)
    {
        System.out.print((char)data);
        data=fis.read();   //IOException——文件读写异常
    }
    fis.close();
}

public void test1()
{
    ' ArrayIndexOutBoundsException——数组越界'
    int arr[]=new int[10];
    System.out.println(arr[10]);
}

public void  test2()
{
    '  NullPointerException——指针空指向'
    
    String str="hello";
    str=null;
    System.out.println(str);
}



public void test3()
{
    Object obj =new String(); //String 赋值给Object对象
    String str =(String)obj; //obj本身就是String类型字符串,所以不报错
    
    Date date =(Date)obj;但是现在变成Date,    'ClassCastException——类型转换异常'
}



public void test4()
{
     'NumberFormatException——数据格式输入异常'
    String str ="123";
    str ="abc";
   int i=Integer.parseInt(str); //把str转化为int类型int i=123
   System.out.println(i)
}



public void test5()
{
      InputMismatchException——输入不一致异常
    Scanner scanner =new Scanner(System.in);
    int num=scanner.nextInt(); //要求int类型,但是你输入的字符串或者其他东西
    System.out.println(num);
}

public void test6()
{
    不在定义域内         ArithmeticException——算术异常
    int num=10;
    System.out.println(num/0);
}                                            

生活中的异常

不是可以避免的,Scanner.nextInt(“abc”)

  • 异常:数组越界,指针悬置,对象没有指向
  • 语法错误:少了分号,冒号,没有定义变量就使用,等等导致编译过不了
  • 逻辑错误:算法设计有误,结果不尽人意
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

异常是程序经常会出现的,发现错误的最佳时机是在编译阶段,也就是你试图在运行程序之前。但是, 在编译期间并不能找到所有的错误,有—些 NullPointerException 和
ClassNotFoundException 异常在编译期找不到,这些异常是 RuntimeException 运行时异常,这些 异常往往在运行时才能被发现。
我们写 Java 程序经常会出现两种问题, —种是 java.lang.Exception , —种是 java.lang.Error,都用来 表示出现了异常情况,下面就针对这两种概念进行理解。

常见error1——栈溢出
在这里插入图片描述

常见error2——堆异常
在这里插入图片描述

Exception异常(重点)
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

常见的编译时异常和运行时异常
Exception异常处理方法——易于维护代码,一般我们都是解决编译时的异常

方式一: try-catch-finally(捕获异常)——直接把狼打死

在这里插入图片描述

抛抓模型:
1、抛——try
程序在执行过程中一旦出现异常,就会出现异常的代码处,生成对应异常类的对象,并且此对象抛出。
一旦抛出,此程序后面代码不可以执行
2、抓——catch
针对于过程1中抛出的异常对象,进行捕获处理。此捕获处理的过程中,就称之为抓。一旦将异常进行,后续代码就可以继续执行。

try {
 可能产生异常的代码   ——抛出异常对象
}
catch(异常类型1 e){
 //当产生了异常1执行的措施   ——错误匹配上了就执行catch里面的代码,否则不执行
}
catch(异常类型2 e){
 //当产生了异常2执行的措施   
}
finally{
    无论是否发生异常都会执行的语句
}
public void test9()
{
    File file =new File("hello.txt");
    FileInputStream fis =new FileInputStream(file);  //FileNotFoundException——文件没有找到
    
    int data =fis.read();//IOException——文件读写异常
    while(data !=-1)
    {
        System.out.print((char)data);
        data=fis.read();   //IOException——文件读写异常
    }
    fis.close();
 catch(FileNotFoundException e){ //
        e.printStackTrace();            
    }
 catch(IOException e){ //(IOException是父类必须放到下面
    e.printStackTrace();
    }

System.out.println("程序运行结束");
}

finally的使用(finally里面的语句必须执行,一般是流资源的关闭声明在finally中)
finally和catch是可以选择的,finally不可以单独使用,
什么样的代码必须声明在finally中呢?
我们在开发过程中finally中一些资源比如说(输入流,输出流,数据库连接,Socket连接的资源,在使用完后,必须显示的进行关闭操作,否则,GC不会自动的回收这些资源。进而导致内存泄漏)

public void test9()
{
    File file =new File("hello.txt");
    FileInputStream fis =new FileInputStream(file);  //FileNotFoundException——文件没有找到
    
    int data =fis.read();//IOException——文件读写异常
    while(data !=-1)
    {
        System.out.print((char)data);
        data=fis.read();   //IOException——文件读写异常
    }

 catch(FileNotFoundException e){ //
        e.printStackTrace();            
    }
 catch(IOException e){ //(IOException是父类必须放到下面
    e.printStackTrace();
    }
    
    //必须执行的语句
    finally{
       try{
        fis.close();
}
catch(IOException e)
{
    e.printStackTrace();
}
}

}

import org.junit.Test
public class FinallyTest{
    @Test
    public void test1()
    {
        //'NumberFormatException——数据格式输入异常'
    String str ="123";
    str ="abc";
   int i=Integer.parseInt(str); //把str转化为int类型int i=123
   System.out.println(i)
   }catch(NumberFormatException e)
   {
       e.printStackTrace();
    }finally{
        System.out.println("程序结束");    
    }
    
}

总结:

编译时的异常可以使用方式1,2处理,不推荐改代码
运行时的异常不推荐使用方式1,2处理,推荐改代码

方式二:throw+异常类型——(叫人)向山下叫人上来帮忙打狼,调用方法
格式:叫人,喊人
语法格式:throws 异常类型1,异常类型2.........
public void test() throws 异常类型1,异常类型2
可以方法中嵌套,
public void Throws(){
public void method1() throws FileNotFoundException, IOException
{
File file =new File("D: \\hello.txt");
FileInputStream fis =new FileInpuntStream(file);

int data =fis.read();
while(data!=-1){
    System.out.print((char)data);
    data =fis.read();
}
 fis.close();                           
 }   
}

开发中如何选择解决编译异常的方式(经验之谈)
有资源一定要被执行的:try-catch-finally
重写try-catch-finally
在这里插入图片描述

认识 Exception

Exception  位于  java.lang   包下,它是—种顶级接口,继承于 其子类都是 Throwable 的组成条件,是程序出现的合理情况。

在认识 Exception 之前,有必要先了解—下什么是 Throwable 。

在这里插入图片描述
在这里插入图片描述

什么是 Throwable——异常的根源类

Throwable 类是 Java 语言中所有 错误(errors) 和 异常(exceptions) 的父类。只有继承于
Throwable 的类或者其子类才能够被抛出,还有—种方式是带有 Java 中的 @throw 注解的类也可以 抛出。
在Java规范中,对非受查异常和受查异常的定义是这样的:

也就是说,除了 RuntimeException checkedException 。和其子类,其它的所有异常都是

那么,按照这种逻辑关系,我们可以对 Throwable 及其子类进行归类分析

可以看到, Throwable 位于异常和错误的最顶层,我们查看 Throwable 类中发现它的方法和属性有很 多,我们只讨论其中几个比较常用的

   //  返回抛出异常的详细信息2   
   public  string  getMessage();  
    public  string  getLocalizedMessage();
     //返回异常发生时的简要描述6     
      public  public  String  toString()//  打印异常信息到标准输出流上9        
       public  void  printStackTrace();   
      public  void  printStackTrace(PrintStream  s);    
      public  void  printStackTrace(PrintWriter  s)
       //  记录栈顿的的当前状态14   
           public  synchronized  Throwable  fillInStackTrace();
此外,因为 Throwable 的父类也是  Object  ,
所以常用的方法还有继承其父类的  getClass()getName()   方法。

**

## 常见的 Exception

**
下面我们回到 Exception 的探讨上来,现在你知道了 Exception 的父类是 Throwable,并且 Exception 有两种异常, —种是 RuntimeException ;—种是 CheckedException ,这两种异常都应该去 捕 获 。
下面列出了—些 Java 中常见的异常及其分类,这块面试官也可能让你举出几个常见的异常情况并将其 分类

RuntimeException

UncheckedException

在这里插入图片描述

与 Exception 有关的 Java 关键字

那么 Java 中是如何处理这些异常的呢?在 Java 中有这几个关键字 throws 、throw 、try 、finally、 catch 下面我们分别来探讨一下
throws 和 throw
在 Java 中,异常也就是一个对象,它能够被程序员自定义抛出或者应用程序抛出,必须借助于 throws 和 throw 语句来定义抛出异常。
throws 和 throw 通常是成对出现的,例如
在这里插入图片描述

throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。 throws 语句用在方法声明后面, 表示再抛出异常,由该方法的调用者来处理。
throws 主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常。 throw 是具 体向外抛异常的动作,所以它是抛出一个异常实例。
try 、finally 、catch
这三个关键字主要有下面几种组合方式 try…catch 、try…finally 、try…catch…finally 。
try…catch 表示对某一段代码可能抛出异常进行的捕获,如下
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3ef7f033b422400c9dfbe017dfff5688.png在这里插入图片描述

try…catch…finally 也是—样的,表示对异常捕获后,再走 finally 中的代码逻辑。
在这里插入图片描述

什么是 Error

Error 是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作 无关,而表示代码运行时 JVM (Java 虚拟机)出现的问题。这些错误是不可检查的,因为它们在应用 程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况,比如
OutOfMemoryError 和 StackOverflowError 异常的出现会有几种情况,这里需要先介绍—下 Java 内存模型 JDK1.7。

其中包括两部分, 由所有线程共享的数据区和线程隔离的数据区组成,在上面的 Java 内存模型中, 只 有程序计数器是不会发生 OutOfMemoryError 情况的区域,程序计数器控制着计算机指令的分支、 循环、跳转、异常处理和线程恢复,并且程序计数器是每个线程私有的。

如果应用程序执行的是 Java 方法,那么这个计数器记录的就是 虚拟机字节码 指令的地址;如果正在执 行的是 Native 方法,这个计数器值则为 空(Undefined) 。
除了程序计数器外,其他区域: 方法区(Method Area) 、 虚拟机栈(VM Stack) 、 本地方法栈 (Native Method Stack) 和 堆(Heap) 都是可能发生 OutOfMemoryError 的区域。
虚拟机栈:如果线程请求的栈深度大于虚拟机栈所允许的深度,将会出现

    StackOverflowError  异常;如果虚拟机动态扩展无法申请到足够的内存,将出现     OutOfMemoryError  。

本地方法栈和虚拟机栈一样

: Java 堆可以处于物理上不连续,逻辑上连续,就像我们的磁盘空间一样,如果堆中没有内存 完成实例分配,并且堆无法扩展时,将会抛出 OutOfMemoryError。

方法区:方法区无法满足内存分配需求时,将抛出 OutOfMemoryError 异常。

在 Java 中,你可以把异常理解为是一种能够提高你程序健壮性的机制,它能够让你在编写代码中注意 这些问题,也可以说,如果你写代码不会注意这些异常情况,你是无法成为一位硬核程序员的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1347573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

20231231_小米音箱接入GPT

参考资料: GitHub - yihong0618/xiaogpt: Play ChatGPT and other LLM with Xiaomi AI Speaker *.设置运行脚本权限 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned *.配置小米音箱 ()pip install miservice_fork -i https://pypi.tuna.tsinghua.edu.cn/sim…

如何设置Android Studio绘制布局时的视图--新手建议收藏!

目录 前言 一、总体步骤 二、详细步骤 三、总结 四、更多资源 前言 在Android Studio中,你可以使用布局编辑器来绘制应用程序的用户界面。布局编辑器提供了一个可视化界面,可让你以所见即所得的方式布局和设计应用程序的视图。 一、总体步骤 打开…

Pytest 项目结合Jenkins

一、window安装centos7虚拟机 参考网上其他教程 二、Linux安装Jenkins 进入jenkins.io网址,点击download,选择CentOS版本 1、Linux中安装java环境和git Jenkins的运行需要java环境;安装git是为代码上传给仓库做准备; yum - y…

idea构建maven项目报错的解决

使用idea创建了一个新的spring项目,maven配置完毕后,报错,引用的依赖不存在。 控制台报错信息如下: 通过查询资料,发现是阿里云的maven仓库中没有这个版本的jar包,导入无法引用到对应的依赖。 解决方法就是…

vmware部署docker+springboot+MySQL(超详细)

一、前期准备 (一)安装jdk #docker search openjdk #docker pull openjdk:8 (二)确认网络 如果局域网其他终端(如手机访问),虚拟机网络连接需要选择《桥接》模式,而且,需要使用有线连接,不能使用Wi-Fi,切忌切忌! 并且要选择实际的那个有线连接。比如我这里是“R…

WorkPlus私有化即时通讯的标杆,助力企业实现信息管控与保障

在信息时代,保护企业的信息安全至关重要。而私有化即时通讯成为了企业提升信息安全的重要手段。作为私有化即时通讯的领先选择,WorkPlus以其卓越的性能和领先的技术,为企业提供了安全可靠的通信解决方案。 私有化即时通讯是企业保护信息安全的…

华为云Stack 8.X流量模型分析(五)

六、EIP流量模型分析 ​ 弹性公网IP(Elastic IP,简称EIP)提供独立的公网IP资源,包括公网IP地址与公网出口带宽服务。如果资源只配置了私网IP,则无法直接访问Internet,为资源配置弹性公网IP后,可…

普中STM32-PZ6806L开发板(HAL库函数实现-按键扫描)

简介 实现按键扫描, 实现四个按键按下控制灯的亮灭 电路原理图 按键电路原理图 按键与主芯片引脚原理图 其他知识 原理图分析 Key_UP按下会有高电平输入, 所以电路设置应该是默认低电平, 初始化为下拉输入 Key_Left/Right/Down按下会有低电平, 初始化为下拉输…

HTML教程(2)——基础标签

一、HTML的元数据 <meta>标签定义关于 HTML 文档的元数据。元数据是关于数据的数据&#xff08;信息&#xff09;,其始终位于<html>元素内&#xff0c;通常用于指定字符集、页面描述、关键词、文档作者和视口设置&#xff1b; 元数据不会显示在页面上&#xff0c…

redis—List列表

目录 前言 1.常见命令 2.使用场景 前言 列表类型是用来存储多个有序的字符串&#xff0c;如图2-19所示&#xff0c;a、b、C、d、e五个元素从左到右组成 了一个有序的列表&#xff0c;列表中的每个字符串称为元素(element) &#xff0c;一个列表最多可以存储2^32 - 1 个元素…

MySQL Too many connections报错

MySQL 时不时出现Too many connections报错&#xff0c;重启MySQL就好了 但是过段时间又出现 一、解决方案&#xff1a; 1.修改mysql最大连接数 set global max_connections500; 以上是修改立即生效的&#xff0c;重启MySQL就会还原回去 在MySQL配置文件修改 max_connection…

GAMES101:作业4记录

文章目录 总览算法编写代码&#xff1a;recursive_bezier()的实现Bezier()函数的实现提高部分&#xff1a;反走样 总览 Bzier 曲线是一种用于计算机图形学的参数曲线。在本次作业中,你需要实现 de Casteljau 算法来绘制由 4 个控制点表示的 Bzier 曲线 (当你正确实现该算法时,…

拒绝采样(算法)总结

先说说什么是拒绝采样算法&#xff1a;就类似于数学上的求阴影面积的方法&#xff0c;直接求求不出来&#xff0c;就用大面积 - 小面积 阴影面积的办法。 所谓拒绝 和 采样 &#xff1a;就像是撒豆子计个数&#xff0c;计算概率问题一样&#xff0c;大桶里面套小桶&#xff0c…

从0到1入门C++编程——01 C++基础知识

文章目录 一、工具安装二、新建项目三、设置字体、注释、行号四、C基础知识1.数据类型2.输入输出3.运算符4.选择、循环结构5.跳转语句6.数组7.函数8.指针9.结构体 一、工具安装 学习C使用到的工具是Visual Studio&#xff0c;Visual Studio 2010旗舰版下载链接&#xff1a;点此…

uni-app模版(扩展插件)

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

2023年终总结|回顾学习Tensorflow、Keras的历程

2023年4月&#xff0c;初探TensorFlow2.0&#xff0c;对比了1.0版本的差异。接着&#xff0c;学习了TensorFlow2.0的常量矩阵、四则运算以及常用函数。学习了数据切割、张量梯度计算、遍历元素、类别索引转换等技巧&#xff0c;并掌握了CNN输出特征图形状的计算方法。 在数据处…

【回溯】图的m着色问题Python实现

文章目录 [toc]问题描述图的 m m m可着色判定问题图的 m m m可着色优化问题四色猜想 回溯法时间复杂性Python实现 个人主页&#xff1a;丷从心 系列专栏&#xff1a;回溯法 问题描述 图的 m m m可着色判定问题 给定无向连通图 G G G和 m m m种不同的颜色&#xff0c;用这些颜…

SpringBoot实用篇

SpringBoot实用篇 1、热部署 什么是热部署&#xff1f; 所谓热部署&#xff0c;就是在应用正在运行的时候升级软件&#xff0c;却不需要重新启动应用。对于Java应用程序来说&#xff0c;热部署就是在运行时更新Java类文件。 热部署有什么用&#xff1f; 节约时间&#xff0c;热…

【python高级用法】迭代器、生成器、装饰器、闭包

迭代器 可迭代对象&#xff1a;可以使用for循环来遍历的&#xff0c;可以使用isinstance()来测试。 迭代器&#xff1a;同时实现了__iter__()方法和__next__()方法&#xff0c;可以使用isinstance()方法来测试是否是迭代器对象 from collections.abc import Iterable, Iterat…

Select缺点及代码示例

一、Select缺点 二、服务器端 #include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/select.h>int main() {// 创建socketint lfd socket(PF_INET, SOCK_STREAM, 0)…