Java新手零基础教程!Java 异常详解.^◡^.

news2024/9/29 23:27:06

Java 异常

Java教程 - Java异常

异常是在运行时在代码序列中出现的异常状况。例如,读取一个不存在的文件。

Java异常是描述异常条件的对象发生在一段代码中。

关键词

Java异常处理通过五个关键字管理: try,catch,throw,throws和finally。

try block包含要监视的程序语句异常。

如果在块中发生异常,则抛出异常。

catch 语句可以捕获异常并以合理的方式处理它。

要手动抛出异常,请使用关键字throw。

任何抛出的异常一个方法必须由一个 throws 子句指定。

任何代码绝对必须是在try块完成之后执行的命令被放在 finally 块中。

语法

要处理一个异常,我们把可能有的代码在try ... catch语句中的异常。

try { 
// block of code to monitor for errors 
} 
catch (ExceptionType1 exOb) { 
// exception handler for ExceptionType1 
}
catch (ExceptionType2 exOb) { 
// exception handler for ExceptionType2 
}

可能有异常的程序语句包含在 try 块中。异常处理程序使用 catch 语句进行编码。

这里, ExceptionType 是发生的异常的类型。

例子

在try块和catch子句中封装要监视的代码。

下面的程序包括一个try块和一个catch子句处理由除法生成的ArithmeticException错误:

public class Main {
  public static void main(String args[]) {
    int d, a;
    try { // monitor a block of code.
      d = 0;
      a = 42 / d;
      System.out.println("This will not be printed.");
    } catch (ArithmeticException e) { // catch divide-by-zero error
      System.out.println("Division by zero.");
    }
    System.out.println("After catch statement.");
  }
}

此程序生成以下输出:

例2

一旦抛出异常,程序控制就会从try块转移到catch块中。执行从未从catch返回到try块。

以下代码处理异常并继续。

import java.util.Random;

public class Main {
  public static void main(String args[]) {
    int a = 0, b = 0, c = 0;
    Random r = new Random();
    for (int i = 0; i < 32000; i++) {
      try {
        b = r.nextInt();
        c = r.nextInt();
        a = 12345 / (b / c);
      } catch (ArithmeticException e) {
        System.out.println("Division by zero.");
        a = 0; // set a to zero and continue
      }
      System.out.println("a: " + a);
    }
  }
}

上面的代码生成以下结果。

Java 异常语句 

Java教程 - Java异常语句

为了防止和处理运行时错误,请将代码包含在try块中进行监视。

紧跟在try块之后,包括一个catch子句它指定您希望捕获的异常类型。

Java try catch语句

public class Main {
  public static void main(String args[]) {
    try { // monitor a block of code.
      int d = 0;
      int a = 42 / d;
      System.out.println("This will not be printed.");
    } catch (ArithmeticException e) { // catch divide-by-zero error
      System.out.println("Division by zero.");
    }
    System.out.println("After catch statement.");
  }
}

上面的代码生成以下结果。

多个catch子句

您可以指定两个或多个catch子句,每个捕获不同类型的异常。

当抛出异常时,将按顺序检查每个catch语句,并执行类型与异常类型匹配的第一个。

在执行一个catch语句之后,绕过其他catch语句,并在try/catch块之后继续执行。

public class Main {
  public static void main(String args[]) {
    try {
      int a = args.length;
      System.out.println("a = " + a);
      int b = 42 / a;
      int c[] = { 1 };
      c[42] = 99;
    } catch (ArithmeticException e) {
      System.out.println("Divide by 0: " + e);
    } catch (ArrayIndexOutOfBoundsException e) {
      System.out.println("Array index oob: " + e);
    }
    System.out.println("After try/catch blocks.");
  }
}

当您使用多个catch语句时,异常子类必须在它们的任何超类之前。

上面的代码生成以下结果。

嵌套try语句

try语句可以嵌套。

public class Main {
  public static void main(String args[]) {
    try {
      int a = args.length;
      int b = 42 / a;
      System.out.println("a = " + a);
      try { // nested try block
        if (a == 1)
          a = a / (a - a); // division by zero exception
        if (a == 2) {
          int c[] = { 1 };
          c[4] = 9; // an out-of-bounds exception
        }
      } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("Array index out-of-bounds: " + e);
      }
    } catch (ArithmeticException e) {
      System.out.println("Divide by 0: " + e);
    }
  }
}

上面的代码生成以下结果。

Java throw语句

我们可以在异常情况下抛出异常。

语法

throw的一般形式如下所示:

 throw ThrowableInstance; 

这里,ThrowableInstance必须是Throwable类型的对象或Throwable的子类。

有两种方法可以获取Throwable对象:在catch子句中使用参数,或者使用new运算符创建一个。

执行流程在throw语句之后立即停止; 任何后续不执行语句。

如何使用Java throws语句?

public class Main {
  static void aMethod() {
    try {
      throw new NullPointerException("demo");
    } catch (NullPointerException e) {
      System.out.println("Caught inside demoproc.");
      throw e; // rethrow the exception
    }
  }

  public static void main(String args[]) {
    try {
      aMethod();
    } catch (NullPointerException e) {
      System.out.println("Recaught: " + e);
    }
  }
}

上面的代码生成以下结果。

Java throws语句

如果一个方法想抛出一个异常,它必须指定这个行为。

这是包含throws子句的方法声明的一般形式:

type method-name(parameter-list) throws exception-list 
{ 
// body of method 
}

exception-list是一个逗号分隔的列表,列出了方法可以抛出的异常。

public class Main {
  static void throwOne() throws IllegalAccessException {
    System.out.println("Inside throwOne.");
    throw new IllegalAccessException("demo");
  }

  public static void main(String args[]) {
    try {
      throwOne();
    } catch (IllegalAccessException e) {
      System.out.println("Caught " + e);
    }
  }
}

上面的代码生成以下结果。

Java finally语句

任何代码,将被执行,不管try块放在一个 finally 阻止。

这是异常处理块的一般形式:

try { 
// block of code to monitor for errors 
} 
catch (ExceptionType1 exOb) { 
// exception handler for ExceptionType1 
}
catch (ExceptionType2 exOb) { 
// exception handler for ExceptionType2 
}
// ... 
finally { 
// block of code to be executed after try block ends 
}

finally 创建一个代码块在 try/catch 块完成后执行。

即使没有catch语句与异常匹配, finally 块也将执行。

finally 块可用于关闭文件句柄和释放任何其他资源。finally子句是可选的。

public class Main {
  // Through an exception out of the method.
  static void methodC() {
    try {
      System.out.println("inside methodC");
      throw new RuntimeException("demo");
    } finally {
      System.out.println("methodC finally");
    }
  }

  // Return from within a try block.
  static void methodB() {
    try {
      System.out.println("inside methodB");
      return;
    } finally {
      System.out.println("methodB finally");
    }
  }

  // Execute a try block normally.
  static void methodA() {
    try {
      System.out.println("inside methodA");
    } finally {
      System.out.println("methodA finally");
    }
  }

  public static void main(String args[]) {
    try {
      methodC();
    } catch (Exception e) {
      System.out.println("Exception caught");
    }
    methodB();
    methodA();
  }
}

上面的代码生成以下结果。

Java 异常类型 

Java教程 - Java异常类型

下图显示了Java异常类型层次结构:

Throwable
 |
 |
 +---Exception. 
 |    |
 |    |
 |    +--- RuntimeException
 |
 +---Error

异常及其子类用于用户程序应捕获的异常条件。您可以子类化Exception以创建自己的自定义异常类型。

错误定义在正常情况下不期望捕获的异常。 Java运行时系统使用错误以指示运行时环境中的错误。 堆栈溢出是这种错误的一个例子。

未捕获异常

这个小程序包括一个有意造成除以零误差的表达式:

public class Main {
  public static void main(String args[]) {
    int d = 0;
    int a = 42 / d;
  }
}

以下是执行此示例时生成的异常:

例子

这里是另一个版本的前面的程序,引入相同的错误,但在一个方法与main()分开:

public class Main {
  static void subroutine() {
    int d = 0;
    int a = 10 / d;
  }

  public static void main(String args[]) {
    subroutine();
  }
}

从默认异常处理程序生成的堆栈跟踪显示如何显示整个调用堆栈:

例2

您可以在println()语句中显示异常描述消息。

例如,catch块可以这样写:

import java.util.Random;

public class Main {
  public static void main(String args[]) {
    int a = 0, b = 0, c = 0;
    Random r = new Random();
    for (int i = 0; i < 32000; i++) {
      try {
        b = r.nextInt();
        c = r.nextInt();
        a = 12345 / (b / c);
      } catch (ArithmeticException e) {
        System.out.println("Exception: " + e); 
        a = 0; // set a to zero and continue
      }
      System.out.println("a: " + a);
    }
  }
}

上面的代码生成以下结果。

什么是Java的内置异常

子类化RuntimeException的异常不需要包含在任何方法的throws列表中。这些被称为未检查异常。

java.lang中定义的未检查异常在下表中列出。

异常含义
ArithmeticException算术错误,如除以零。
ArrayIndexOutOfBoundsException数组索引超出边界。
ArrayStoreException分配给不兼容类型的数组元素。
ClassCastException投射无效。
EnumConstantNotPresentException尝试使用未定义的枚举值。
IllegalArgumentException用于调用方法的非法参数。
IllegalMonitorStateException非法监视器操作,例如等待解锁的线程。
IllegalStateException环境或应用程序状态不正确。
IllegalThreadStateException请求的操作与当前线程状态不兼容。
IndexOutOfBoundsException一些类型的索引是超出界限的。
NegativeArraySizeException使用负尺寸创建的数组。
NullPointerException无效引用的使用无效。
NumberFormatException字符串到数字格式的转换无效。
SecurityException试图违反安全。
StringIndexOutOfBounds尝试在字符串的边界之外建立索引。
TypeNotPresentException未找到类型。
UnsupportedOperationException遇到不支持的操作。

检查的异常在下表中列出。

异常含义
ClassNotFoundException找不到类。
CloneNotSupportedException尝试克隆不实现Cloneable接口的对象。
IllegalAccessException对类的访问被拒绝。
InstantiationException尝试创建抽象类或接口的对象。
InterruptedException一个线程已被另一个线程中断。
NoSuchFieldException请求的字段不存在。
NoSuchMethodException请求的方法不存在。

Java自定义异常类

您可以通过定义 Exception 的子类来创建自己的异常类。

异常类没有定义自己的任何方法。它继承由 Throwable 提供的方法。

以下程序创建自定义异常类型。

class MyException extends Exception {
  private int detail;

  MyException(int a) {
    detail = a;
  }

  public String toString() {
    return "MyException[" + detail + "]";
  }
}

public class Main {
  static void compute(int a) throws MyException {
    System.out.println("Called compute(" + a + ")");
    if (a > 10)
      throw new MyException(a);
    System.out.println("Normal exit");
  }

  public static void main(String args[]) {
    try {
      compute(1);
      compute(20);
    } catch (MyException e) {
      System.out.println("Caught " + e);
    }
  }
}

上面的代码生成以下结果。

Java链接异常

链接异常允许您将另一个异常与异常相关联。第二个异常描述了第一个异常的原因。

为了允许链接异常,两个构造函数和两个方法被添加到 Throwable 

Throwable(Throwable causeExc) 
Throwable(String msg, Throwable causeExc)

这里是一个例子,说明处理链接异常的机制:

public class Main {
  static void demoproc() {
    NullPointerException e = new NullPointerException("top layer");
    e.initCause(new ArithmeticException("cause"));
    throw e;
  }

  public static void main(String args[]) {
    try {
      demoproc();
    } catch (NullPointerException e) {
      System.out.println("Caught: " + e);
      System.out.println("Original cause: " + e.getCause());
    }
  }
}

上面的代码生成以下结果。

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

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

相关文章

优思学院|质量工程师常用英语【客户投诉篇】

作为质量工程师&#xff0c;你是否曾因国外客户的投诉而不知如何用英语回应&#xff0c;感到困扰&#xff1f; 质量工程师常常面对各种挑战。即使你解决问题的能力很强&#xff0c;但由于不熟悉使用英语&#xff0c;可能会影响客户对你的印象和信任。 接下来&#xff0c;让我…

C#面试题系列--动态更新

C#面试题系列 排版排了半天&#xff0c;也是不好看&#xff0c;那就不排版了&#xff0c;尽量由易到难 高级一些 什么是MVC模式C#中特性是什么&#xff1f;如何使用&#xff1f;C#中什么是反射?C#中的委托是什么 事件是不是一种委托C# 不安全代码C# 隐式类型 varC# linqC# 匿名…

在centos中安装 --nmon性能系统监控工具

参考资料 CentOS安装nmon-CSDN博客 Jmeter(十九)&#xff1a;nmon性能系统监控工具_jmeter nmon(1)_jmeter nmon性能系统监控工具详解-CSDN博客 Linux性能监控命令_nmon 安装与使用_nmon安装方法linux-CSDN博客 资源监控工具nmon安装及使用 – TestGo 下载启宏插件 https…

学习日志8.21--防火墙NAT

在学习过基于路由器的NAT网络地址转换&#xff0c;现在学习基于防火墙NAT的网络地址转换&#xff0c;防火墙的NAT配置和路由器的NAT配置还是有比较大的区别。 防火墙NAT是通过NAT策略实现的&#xff0c;在创建防火墙NAT之前需要先创建防火墙的安全策略。防火墙是不能直接在接口…

i2c-tool工具

i2c-tool工具的使用方法 包括i2cdetect、i2cget、i2cset、i2cdump、i2ctransfer i2cdetect命令 该命令用于扫描I2C总线上的设备。 语法&#xff1a;i2cdetect [-y] [-a] [-q|-r] i2cbus [first last]&#xff1a;参数说明&#xff1a;参数y&#xff1a;关闭交互模式&#xf…

GEE 教程:如何实现对指定矢量集合的归一化操作(以北京市各区县面积和边长为例)

简介 数据归一化处理是指将数据按照一定的规则进行变换&#xff0c;使数据落入一个特定的区间范围内。数据归一化处理的目的是消除数据之间的量纲差异&#xff0c;同时保留数据的分布特征&#xff0c;以便更好地进行数据分析和建模。 常见的数据归一化方法有如下几种&#xf…

快讯 | 谷歌AI引擎GameNGen颠覆游戏产业:0代码生成《毁灭战士》

硅纪元快讯栏目&#xff0c;每日追踪AI领域的最新动态&#xff0c;快速汇总最新科技新闻&#xff0c;助您时刻紧跟行业趋势。简明扼要的呈现资讯概要&#xff0c;让您快速了解前沿资讯。 1分钟速览新闻 ChatGPT用户翻倍突破2亿&#xff0c;AI工具融入日常生活 智谱AI发布尖端语…

电工手册 v77.9 — 专业电气知识与实用工具(Mod版)

电工手册是一款专门为电力领域从业者及爱好者设计的知识普及与技能提升应用。无论你是专业电工、DIY爱好者&#xff0c;还是对电力领域有兴趣的学生&#xff0c;这款应用都能为你提供大量实用的资源和工具。内容涵盖电气理论、接线图和计算器等多个方面&#xff0c;旨在帮助用户…

(echarts)散点图怎么给横坐标添加单位

&#xff08;echarts&#xff09;散点图怎么给横坐标添加单位 效果&#xff1a; 代码&#xff1a; 拓展-给值加

类在JVM中的工作原理

文章目录 引言I 类在JVM中的工作原理class文件的结构类的生命周期II JVM运行时数据区堆栈的意义栈帧内部结构堆III 在JIT中比较常见的优化手段引言 类是一种抽象概念,它是一种模板,用来定义一类事物的属性和行为。类是面向对象编程的基础,它是一种抽象的概念,代表一类事物…

Java 魔法类 Unsafe 源码解读(一)

Java 魔法类 Unsafe 源码解读&#xff08;一&#xff09; 前言 阅读过 JUC 源码的同学&#xff0c;一定会发现很多并发工具都调用了一个叫做 Unsafe 的类。 那这个类的作用是什么呢&#xff1f;有什么使用场景呢&#xff1f;底层源码是什么样呢&#xff1f;这篇文章笔者就带…

uni-app商城小程序+后台管理系统,手把手教你搭建

uni-app商城小程序是一种通过uni-app框架开发的&#xff0c;可以在微信、支付宝、字节跳动等多个平台上运行的轻量级电商应用。 一、特点 跨平台兼容&#xff1a;基于uni-app框架&#xff0c;一次开发&#xff0c;可同时适配微信小程序、支付宝小程序、H5、App等多个平台&…

3DMAX2025新款插件精选大全

关于3DMAX2025的新款插件&#xff0c;虽然无法提供一个详尽无遗的列表&#xff0c;本文根据公开发布的信息和插件的流行趋势&#xff0c;概述一些新款插件或插件更新。请注意&#xff0c;由于插件市场不断变化&#xff0c;以下信息可能随时间而有所更新。 以下插件按首字母排序…

ts转mp4怎么转?分享3个方法,快速搞定

在视频编辑和处理的世界里&#xff0c;格式转换是一个常见且必要的任务。特别是当你手头上有一些ts格式的视频文件&#xff0c;而你又需要将它们转换成更通用、更容易分享的mp4格式时&#xff0c;了解如何进行转换就显得尤为重要。 只有掌握了格式转换的技能&#xff0c;我们才…

yolov8训练野火烟雾识别检测模型

1.数据集下载 数据集下载链接&#xff1a;https://hyper.ai/datasets/33096 2. 数据集格式转换 需要将json中的标注信息转换为yolo格式的标注文件数据 import json import os import shutil import cv2 import matplotlib.pyplot as plttarget "./data/val" def…

如何在没有密码的情况下解锁 Oppo 手机?5 种简单的方法

保护智能手机隐私的一种很好的方法是设置复杂的锁屏密码或图案。一些 OPPO 手机的所有者在更改后一夜之间经历了图案或密码的内存丢失。事实上&#xff0c;OPPO 用户遇到的众多问题包括忘记密码或锁定屏幕。遗憾的是&#xff0c;没有多少人知道无需密码即可解锁 OPPO 手机的简单…

JAVA毕业设计166—基于Java+Springboot+vue3的流浪宠物救助管理小程序(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3的流浪宠物救助管理小程序(源代码数据库)166 一、系统介绍 本项目前后端分离带小程序(可以改为ssm版本)&#xff0c;分为用户、救助站、管理员三种角色 1、…

chapter09-OOP高级部分——(类变量和类方法)——day12

目录 ​编辑 374-类变量引出 375-类变量快速入门 376-类变量内存剖析 377-类变量定义访问 378-类变量使用细节 379-类方法快速入门 380-类方法最佳实践 381-类方法注意事项 静态方法只能访问静态变量 非静态方法可以访问静态成员和非静态成员&#xff08;都可以访问…

OpenAI AI 聊天机器人周活跃用户超 2 亿

&#x1f989; AI新闻 &#x1f680; OpenAI AI 聊天机器人周活跃用户超 2 亿 摘要&#xff1a;科技媒体 Axios 报道&#xff0c;OpenAI 的 AI 聊天机器人在短短一年内实现了周活跃用户超过 2 亿的增长。该公司表示&#xff0c;全球财富 500 强企业中已有 92% 使用其产品&…

革新客户服务艺术:揭秘高效集成第三方平台与质检升级的前沿策略

Hi~这里是ProXiao 文章参考&#xff1a;晓观点 如何实现与第三方客服平台的有效对接并提高客户服务的质检水平&#xff1f;https://insight.xiaoduoai.com/intelligent-tools/quality-inspection/how-to-achieve-effective-integration-with-third-party-customer-service-pl…