当前位置: 首页 > news >正文

【Java基础】17.异常处理

文章目录

  • 前言
  • 一、异常的概念
    • 1.异常的3种类型
    • 2.支持异常处理的关键字和类
  • 二、Exception 类的层次
  • 三、内置异常类
    • 1.非检查性异常
    • 2.检查性异常类
  • 四、异常处理
    • 1.捕获异常
    • 2.多重捕获块
    • 3.throws/throw 关键字
      • 1.throw 关键字
      • 2.throws 关键字
    • 3.finally关键字
  • 五、编译时异常处理方式
    • 1.编译时异常处理方法1
    • 2.编译时异常处理方法2
    • 3.编译时异常处理方法3
  • 六、运行时异常处理方法


前言

在 Java 中,异常处理是一种重要的编程概念,用于处理程序执行过程中可能出现的错误或异常情况。
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error ,如果你用 System.out.println(11/0) ,那么你是因为你用 0 做了除数,会抛出 java.lang.ArithmeticException 的异常。


一、异常的概念

异常是程序在"编译"或者"执行"的过程中可能出现的问题。
异常是应该尽量提前避免的。
异常可能也是无法做到绝对避免的,异常可能有太多情况了,开发中只能提前干预!!
异常一旦出现了,如果没有提前处理,程序就会退出 JVM 虚拟机而终止,开发中异常是需要提前处理的。
研究异常并且避免异常,然后提前处理异常,体现的是程序的安全, 健壮性!!!
Java 会为常见的代码异常都设计一个类来代表。

异常发生的原因有很多,通常包含以下几大类:

  • 用户输入了非法数据。
  • 要打开的文件不存在。
  • 网络通信时连接中断,或者JVM内存溢出。

这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。

1.异常的3种类型

  • 检查性异常/编译时异常:继承了Exception,编译阶段就报错,必须处理,否则代码不通过。最具代表的检查性异常是用户错误或问题引起的异常,这些异常在编译时强制要求程序员处理。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
    这类异常通常使用 try-catch 块来捕获并处理异常,或者在方法声明中使用 throws 子句声明方法可能抛出的异常。
try {// 可能会抛出异常的代码
} catch (IOException e) {// 处理异常的代码
}

或者

public void readFile() throws IOException {// 可能会抛出IOException的代码
}
  • 运行时异常: 继承了RuntimeException,编译阶段不会报错,运行时才可能出现。这些异常在编译时不强制要求处理,通常是由程序中的错误引起的,例如 NullPointerException、ArrayIndexOutOfBoundsException 等,这类异常还是建议提前处理!!
try {// 可能会抛出异常的代码
} catch (NullPointerException e) {// 处理异常的代码
}
  • 错误: 错误不是异常,而是脱离程序员控制的问题,错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

编译时异常实例:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;/*** @ClassName: ExceptionDemo* @Description: 编译时异常* 编译时异常:继承自Exception的异常或者其子类,没有继承RuntimeException* 编译时异常是编译阶段就会报错,必须程序员编译阶段就处理的。否则代码编译就报错!!* @author: Zh* @date: 2024/4/16 21:34*/
public class ExceptionDemo {public static void main(String[] args) throws ParseException {String date = "2015-01-12 10:23:21";// 创建一个简单日期格式化类:SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM-dd HH:mm:ss");SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 编译时异常,报错,日期格式不对// Exception in thread "main" java.text.ParseException: Unparseable date: "2015-01-12 10:23:21"// Date d = sdf.parse(date);// System.out.println(d);Date d1 = sdf1.parse(date);System.out.println(d1);}
}

运行时异常实例:

/*** @ClassName: ExceptionDemo* @Description: 运行时异常* 运行时异常的概念:* 继承自RuntimeException的异常或者其子类,* 编译阶段是不会出错的,它是在运行时阶段可能出现的错误,* 运行时异常编译阶段可以处理也可以不处理,代码编译都能通过!!* 常见运行时异常:* 1.数组索引越界异常: ArrayIndexOutOfBoundsException。* 2.空指针异常 : NullPointerException。直接输出没有问题。但是调用空指针的变量的功能就会报错!!* 3.类型转换异常:ClassCastException。* 4.迭代器遍历没有此元素异常:NoSuchElementException。* 5.数学操作异常:ArithmeticException。* 6.数字转换异常: NumberFormatException。* @author: Zh* @date: 2024/4/16 21:38*/
public class ExceptionDemo {public static void main(String[] args) {System.out.println("程序开始。。。。。。");/** 1.数组索引越界异常: ArrayIndexOutOfBoundsException。*/int[] arr = {1, 2, 3}; // 0 1 2System.out.println("数组索引越界:" + arr[2]); // 3// System.out.println(arr[3]); // 运行出错,程序终止/** 2.空指针异常 : NullPointerException。直接输出没有问题。但是调用空指针的变量的功能就会报错!! */String name = null;System.out.println("空指针:" + name); // null// System.out.println(name.length()); // 运行出错,程序终止/** 3.类型转换异常:ClassCastException。 */Object o = 23;Integer i = (Integer) o;System.out.println("类型转换:" + i);// String s = (String) o;  // 运行出错,程序终止/** 5.数学操作异常:ArithmeticException。 */int a = 10 / 2;System.out.println("数学操作:" + a);//int c = 10 / 0; // 运行出错,程序终止/** 6.数字转换异常: NumberFormatException。 */String number = "23";Integer it = Integer.valueOf(number);System.out.println("数字转换:" + (it + 1));String number1 = "23aabbc";// Integer it1 = Integer.valueOf(number1); // 运行出错,程序终止System.out.println("程序结束。。。。。");}
}

2.支持异常处理的关键字和类

Java 提供了以下关键字和类来支持异常处理:

  • try:用于包裹可能会抛出异常的代码块。
  • catch:用于捕获异常并处理异常的代码块。
  • finally:用于包含无论是否发生异常都需要执行的代码块。
  • throw:用于手动抛出异常。
  • throws:用于在方法声明中指定方法可能抛出的异常。
  • Exception类:是所有异常类的父类,它提供了一些方法来获取异常信息,如 getMessage()、printStackTrace() 等。

二、Exception 类的层次

所有的异常类是从 java.lang.Exception 类继承的子类。
Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。
Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。
Error 用来指示运行时环境发生的错误。
例如,JVM 内存溢出。一般地,程序不会从错误中恢复。
异常类有两个主要的子类:IOException 类和 RuntimeException 类。
Exception 类的层次

  • Exception:才是异常类,它才是开发中代码在编译或者执行的过程中可能出现的错误,它是需要提前处理的。以便程序更健壮!
  • Error : 错误的意思,严重错误Error,无法通过处理的错误,一旦出现,程序员无能为力了,只能重启系统,优化项目。比如内存奔溃,JVM 本身的奔溃。这个程序员无需理会。

三、内置异常类

Java 语言定义了一些异常类在 java.lang 标准包中。
标准运行时异常类的子类是最常见的异常类。由于 java.lang 包是默认加载到所有的 Java 程序的,所以大部分从运行时异常类继承而来的异常都可以直接使用。
Java 根据各个类库也定义了一些其他的异常。

1.非检查性异常

下面中列出了 Java 的非检查性异常。

  • ArithmeticException:当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。
  • ArrayIndexOutOfBoundsException:用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。
  • ArrayStoreException:试图将错误类型的对象存储到一个对象数组时抛出的异常。
  • ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出该异常。
  • IllegalArgumentException:抛出的异常表明向方法传递了一个不合法或不正确的参数。
  • IllegalMonitorStateException:抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。
  • IllegalStateException:在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。
  • IllegalThreadStateException:线程没有处于请求操作所要求的适当状态时抛出的异常。
  • IndexOutOfBoundsException:指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
  • NegativeArraySizeException:如果应用程序试图创建大小为负的数组,则抛出该异常。
  • NullPointerException:当应用程序试图在需要对象的地方使用 null 时,抛出该异常。
  • NumberFormatException:当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
  • SecurityException:由安全管理器抛出的异常,指示存在安全侵犯。
  • StringIndexOutOfBoundsException:此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。
  • UnsupportedOperationException:当不支持请求的操作时,抛出该异常。

2.检查性异常类

下面列出了 Java 定义在 java.lang 包中的检查性异常类。

  • ClassNotFoundException:应用程序试图加载类时,找不到相应的类,抛出该异常。
  • CloneNotSupportedException:当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。
  • IllegalAccessException:拒绝访问一个类的时候,抛出该异常。
  • InstantiationException:当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。
  • InterruptedException:一个线程被另一个线程中断,抛出该异常。
  • NoSuchFieldException:请求的变量不存在。
  • NoSuchMethodException:请求的方法不存在。

四、异常处理

1.捕获异常

使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。

try/catch代码块中的代码称为保护代码,使用 try/catch 的语法如下:

try
{// 程序代码
}catch(ExceptionName e1)
{//Catch 块
}

Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。
如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数的方法是一样。
实例:

public class ExceptionDemo2 {public static void main(String args[]){try{int a[] = {22,55,88};System.out.println("Access element 0 :" + a[0]);System.out.println("Access element 1 :" + a[1]);System.out.println("Access element 2 :" + a[2]);System.out.println("Access element 3 :" + a[3]);}catch(ArrayIndexOutOfBoundsException e){System.out.println("Exception thrown  :" + e);}System.out.println("Out of the block");}
}

编译运行结果如下:

Access element 0 :22
Access element 1 :55
Access element 2 :88
Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
Out of the block

2.多重捕获块

一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。
多重捕获块的语法如下所示:

try{// 程序代码
}catch(异常类型1 异常的变量名1){// 程序代码
}catch(异常类型2 异常的变量名2){// 程序代码
}catch(异常类型3 异常的变量名3){// 程序代码
}

上面的代码段包含了 3 个 catch块。
可以在 try 语句后面添加任意数量的 catch 块。
如果保护代码中发生异常,异常被抛给第一个 catch 块。
如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。
如果不匹配,它会被传递给第二个 catch 块。
如此,直到异常被捕获或者通过所有的 catch 块。
实例:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;/*** @ClassName: ExceptionDemo3* @Description: try/catch多重捕获块* @author: Zh* @date: 2024/4/16 23:00*/
public class ExceptionDemo3 {public static void main(String[] args) {System.out.println("程序开始。。。。");parseTime2("2023-11-23 23:23:23");System.out.println("程序结束。。。。");}public static void parseTime2(String date) {try {SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM-dd HH:mm:ss");Date d = sdf.parse(date);System.out.println(d);InputStream is = new FileInputStream("E:/meinv.jpg");} catch (FileNotFoundException e) {System.out.println("parseTime2:FileNotFoundException e");} catch (ParseException e) {System.out.println("parseTime2:ParseException e");}}
}

编译运行结果如下:

程序开始。。。。
parseTime2:ParseException e
程序结束。。。。

3.throws/throw 关键字

在Java中, throw 和 throws 关键字是用于处理异常的。
throw 关键字用于在代码中抛出异常,而 throws 关键字用于在方法声明中指定可能会抛出的异常类型。

1.throw 关键字

throw 关键字用于在当前方法中抛出一个异常。
通常情况下,当代码执行到某个条件下无法继续正常执行时,可以使用 throw 关键字抛出异常,以告知调用者当前代码的执行状态。
例如,下面的代码中,在方法中判断 num 是否小于 0,如果是,则抛出一个 IllegalArgumentException 异常。

/*** @ClassName: ThrowDemo* @Description: throw关键字* 用于在当前方法中抛出一个异常。* @author: Zh* @date: 2024/4/16 23:12*/
public class ThrowDemo {public static void main(String[] args) {checkNumber(-10);}public static void checkNumber(int num) {if (num < 0) {throw new IllegalArgumentException("数字必须为正数。");}else {System.out.println(num + "是正数。");}}}

运行结果如下:

Exception in thread "main" java.lang.IllegalArgumentException: 数字必须为正数。at com.itheima.d7_exception_handle.ThrowDemo.checkNumber(ThrowDemo.java:11)at com.itheima.d7_exception_handle.ThrowDemo.main(ThrowDemo.java:5)

2.throws 关键字

throws 关键字用于在方法声明中指定该方法可能抛出的异常。当方法内部抛出指定类型的异常时,该异常会被传递给调用该方法的代码,并在该代码中处理异常。

/*** @ClassName: ThrowsDemo* @Description: throws关键字* 用于在方法声明中指定该方法可能抛出的异常。* @author: Zh* @date: 2024/4/16 23:14*/
public class ThrowsDemo {public static void main(String[] args) {try {checkAge(-34);} catch (IllegalArgumentException e) {e.printStackTrace();}}public static void checkAge(int age) throws IllegalArgumentException {if (age < 0 || age > 200) {// 抛出去一个异常对象给调用者// throw :在方法内部直接创建一个异常对象,并从此点抛出// throws : 用在方法申明上的,抛出方法内部的异常throw new IllegalArgumentException(age + " is illeagal!");} else {System.out.println("年龄合法:推荐商品给其购买~~");}}
}

运行结果如下:

java.lang.IllegalArgumentException: -34 is illeagal!at com.itheima.d7_exception_handle.ThrowsDemo.checkAge(ThrowsDemo.java:24)at com.itheima.d7_exception_handle.ThrowsDemo.main(ThrowsDemo.java:13)

3.finally关键字

finally 关键字用来创建在 try 代码块后面执行的代码块。
无论是否发生异常,finally 代码块中的代码总会被执行。
在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。
finally 代码块出现在 catch 代码块最后,语法如下:

try{// 程序代码
}catch(异常类型1 异常的变量名1){// 程序代码
}catch(异常类型2 异常的变量名2){// 程序代码
}finally{// 程序代码
}

实例:

public class FinallyDemo {public static void main(String args[]){int a[] = new int[2];try{System.out.println("Access element three :" + a[3]);}catch(ArrayIndexOutOfBoundsException e){System.out.println("Exception thrown  :" + e);}finally{a[0] = 6;System.out.println("First element value: " +a[0]);System.out.println("The finally statement is executed");}}
}

运行结果如下:

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 2
First element value: 6
The finally statement is executed

五、编译时异常处理方式

1.编译时异常处理方法1

抛出异常的方式:代表可以抛出一切异常。
抛出异常格式:

方法 throws Exception{}

实例:

import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;/*** @ClassName: ExceptionDemo01* @Description: 编译时异常, 处理方式一* 抛出异常格式:* 方法 throws 异常1 ,  异常2 , ..{}* 建议抛出异常的方式:代表可以抛出一切异常,* 方法 throws Exception{}* 方式一:* 在出现编译时异常的地方层层把异常抛出去给调用者,调用者最终抛出给JVM虚拟机。* JVM虚拟机输出异常信息,直接干掉程序,这种方式与默认方式是一样的。* 虽然可以解决代码编译时的错误,但是一旦运行时真的出现异常,程序还是会立即死亡!* 这种方式并不好!* 小结:方式一出现异常层层跑出给虚拟机,最终程序如果真的出现异常,程序还是立即死亡!这种方式不好!* @author: Zh* @date: 2024/4/16 21:43*/
public class ExceptionDemo01 {public static void main(String[] args) throws Exception {System.out.println("程序开始。。。。。");parseTime("2011-11-11 11:11:11");System.out.println("程序结束。。。。。");}public static void parseTime(String date) throws Exception {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d = sdf.parse(date);System.out.println(d);// 报错:FileNotFoundException,系统找不到指定的路径InputStream is = new FileInputStream("E:/meinv.jpg");}}

报错信息:

程序开始。。。。。
Fri Nov 11 11:11:11 CST 2011
Exception in thread "main" java.io.FileNotFoundException: E:\meinv.jpg (系统找不到指定的路径。)at java.base/java.io.FileInputStream.open0(Native Method)at java.base/java.io.FileInputStream.open(FileInputStream.java:216)at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)at java.base/java.io.FileInputStream.<init>(FileInputStream.java:111)at com.itheima.d7_exception_handle.ExceptionDemo01.parseTime(ExceptionDemo01.java:38)at com.itheima.d7_exception_handle.ExceptionDemo01.main(ExceptionDemo01.java:28)

2.编译时异常处理方法2

在出现异常的地方自己处理,谁出现谁处理。
抛出异常格式:

try{// 可能出现异常的代码!}catch (Exception e){e.printStackTrace(); // 直接打印异常栈信息}

实例:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;/*** @ClassName: ExceptionDemo02* @Description: 编译时异常, 处理方式二* 方式二:在出现异常的地方自己处理,谁出现谁处理。* 自己捕获异常和处理异常的格式:捕获处理* 格式:* try{* // 监视可能出现异常的代码!* }catch(异常类型1 变量){* // 处理异常* }catch(异常类型2 变量){* // 处理异常* }...* 监视捕获处理异常企业级写法:* try{* // 可能出现异常的代码!* }catch (Exception e){* e.printStackTrace(); // 直接打印异常栈信息* }* Exception可以捕获处理一切异常类型!* 小结:* 第二种方式,可以处理异常,并且出现异常后代码也不会死亡。* 这种方案还是可以的。* 但是从理论上来说,这种方式不是最好的,上层调用者不能直接知道底层的执行情况!* @author: Zh* @date: 2024/4/16 22:07*/
public class ExceptionDemo02 {public static void main(String[] args) {System.out.println("程序开始。。。。");System.out.println("----建议的try catch方式----");parseTime("2011-11-11 11:11:11");System.out.println("----其他try catch方式----");parseTime1("2022-12-22 22:22:22");parseTime2("2023-11-23 23:23:23");parseTime3("2024-10-24 24:24:24");System.out.println("程序结束。。。。");}/*** 建议的try catch方式** @param date*/public static void parseTime(String date) {try {SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM-dd HH:mm:ss");Date d = sdf.parse(date);System.out.println(d);InputStream is = new FileInputStream("E:/meinv.jpg");} catch (Exception e) {e.printStackTrace(); // 打印异常栈信息}}public static void parseTime1(String date) {try {SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM-dd HH:mm:ss");Date d = sdf.parse(date);System.out.println(d);InputStream is = new FileInputStream("E:/meinv.jpg");} catch (FileNotFoundException | ParseException e) {System.out.println("parseTime1:FileNotFoundException|ParseException e");e.printStackTrace(); // 打印异常栈信息}}public static void parseTime2(String date) {try {SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM-dd HH:mm:ss");Date d = sdf.parse(date);System.out.println(d);InputStream is = new FileInputStream("E:/meinv.jpg");} catch (FileNotFoundException e) {System.out.println("parseTime2:FileNotFoundException e");e.printStackTrace(); // 打印异常栈信息} catch (ParseException e) {System.out.println("parseTime2:ParseException e");e.printStackTrace();}}public static void parseTime3(String date) {try {SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM-dd HH:mm:ss");Date d = sdf.parse(date);System.out.println(d);} catch (ParseException e) {// 解析出现问题System.out.println("出现了解析时间异常哦,走点心!!");}try {InputStream is = new FileInputStream("E:/meinv.jpg");} catch (FileNotFoundException e) {System.out.println("您的文件根本就没有啊,不要骗我哦!!");}}
}

报错信息:

程序开始。。。。
----建议的try catch方式----
java.text.ParseException: Unparseable date: "2011-11-11 11:11:11"at java.base/java.text.DateFormat.parse(DateFormat.java:399)at com.itheima.d7_exception_handle.ExceptionDemo02.parseTime(ExceptionDemo02.java:56)at com.itheima.d7_exception_handle.ExceptionDemo02.main(ExceptionDemo02.java:41)
java.text.ParseException: Unparseable date: "2022-12-22 22:22:22"at java.base/java.text.DateFormat.parse(DateFormat.java:399)at com.itheima.d7_exception_handle.ExceptionDemo02.parseTime1(ExceptionDemo02.java:69)at com.itheima.d7_exception_handle.ExceptionDemo02.main(ExceptionDemo02.java:43)
java.text.ParseException: Unparseable date: "2023-11-23 23:23:23"at java.base/java.text.DateFormat.parse(DateFormat.java:399)at com.itheima.d7_exception_handle.ExceptionDemo02.parseTime2(ExceptionDemo02.java:82)at com.itheima.d7_exception_handle.ExceptionDemo02.main(ExceptionDemo02.java:44)
----其他try catch方式----
FileNotFoundException|ParseException e
ParseException e
出现了解析时间异常哦,走点心!!
您的文件根本就没有啊,不要骗我哦!!
程序结束。。。。

3.编译时异常处理方法3

在出现异常的地方把异常一层一层的抛出给最外层调用者,最外层调用者集中捕获处理!!(规范做法)
实例:

import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;/*** @ClassName: ExceptionDemo03* @Description: 编译时异常,处理方式三* 方式三: 在出现异常的地方把异常一层一层的抛出给最外层调用者,最外层调用者集中捕获处理!!(规范做法)* 小结:* 编译时异常的处理方式三:底层出现的异常抛出给最外层调用者集中捕获处理。* 这种方案最外层调用者可以知道底层执行的情况,同时程序在出现异常后也不会立即死亡,这是* 理论上最好的方案。* 虽然异常有三种处理方式,但是开发中只要能解决你的问题,每种方式都又可能用到!!* @author: Zh* @date: 2024/4/16 22:22*/
public class ExceptionDemo03 {public static void main(String[] args) {System.out.println("程序开始。。。。");try {parseTime("2011-11-11 11:11:11");System.out.println("功能操作成功~~~");} catch (Exception e) {e.printStackTrace();System.out.println("功能操作失败~~~");}System.out.println("程序结束。。。。");}public static void parseTime(String date) throws Exception {SimpleDateFormat sdf = new SimpleDateFormat("yyyy、MM-dd HH:mm:ss");Date d = sdf.parse(date);System.out.println(d);InputStream is = new FileInputStream("D:/meinv.jpg");}}

报错信息:

程序开始。。。。
java.text.ParseException: Unparseable date: "2011-11-11 11:11:11"at java.base/java.text.DateFormat.parse(DateFormat.java:399)at com.itheima.d7_exception_handle.ExceptionDemo03.parseTime(ExceptionDemo03.java:35)at com.itheima.d7_exception_handle.ExceptionDemo03.main(ExceptionDemo03.java:24)
功能操作失败~~~
程序结束。。。。

六、运行时异常处理方法

可以不处理,编译阶段又不报错。但是按照理论规则:建议还是处理,只需要在最外层捕获处理即可。
实例:

/*** @ClassName: Test* @Description: 运行时异常,处理方法。* 可以不处理,编译阶段又不报错。* 按照理论规则:建议还是处理,只需要在最外层捕获处理即可* @author: Zh* @date: 2024/4/16 22:26*/
public class Test {public static void main(String[] args) {System.out.println("程序开始。。。。。。。。。。");try {chu(10, 0);} catch (Exception e) {e.printStackTrace();}System.out.println("程序结束。。。。。。。。。。");}public static void chu(int a, int b) { // throws RuntimeException{System.out.println(a);System.out.println(b);int c = a / b;System.out.println(c);}
}

报错信息:

Connected to the target VM, address: '127.0.0.1:14490', transport: 'socket'
程序开始。。。。。。。。。。
10
0
程序结束。。。。。。。。。。
java.lang.ArithmeticException: / by zeroat com.itheima.d8_exception_handle_runtime.Test.chu(Test.java:25)at com.itheima.d8_exception_handle_runtime.Test.main(Test.java:15)
Disconnected from the target VM, address: '127.0.0.1:14490', transport: 'socket'

相关文章:

【Java基础】17.异常处理

文章目录 前言一、异常的概念1.异常的3种类型2.支持异常处理的关键字和类 二、Exception 类的层次三、内置异常类1.非检查性异常2.检查性异常类 四、异常处理1.捕获异常2.多重捕获块3.throws/throw 关键字1.throw 关键字2.throws 关键字 3.finally关键字 五、编译时异常处理方式…...

【python】flask结合SQLAlchemy,在视图函数中实现对数据库的增删改查

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

APIGateway的认证

APIGateway的支持的认证如下&#xff1a; 我们从表格中可以看到&#xff0c;HTTP API 不支持资源策略的功能&#xff0c;另外是通过JWT的方式集成Cognito的。 对于REST API则是没有显示说明支持JWT认证&#xff0c;这个我们可以通过Lambda 自定义的方式来实现。 所以按照这个…...

MacOS Github Push项目 精简版步骤

大白菜教程&#xff1a;小白菜 macOS github提交代码-CSDN博客 步骤1&#xff1a;git init步骤2&#xff1a; touch .gitignore 创建ignore文件 open .gitignore 打开ignore文件 编写ignore文件.idea/ 是文件夹的意思.git/ 也是自动生成的文件夹 也不上传.DS_St…...

Eclipse的基本使用讲解(建项目,建包,建类,写代码(基本语法))新手入门必备

目录 一.介绍eclipse 二.操作Eclipse 1.选择工作空间 2.建项目&#xff0c;建包&#xff0c;建类 1.建项目(两种) 2.建包 3.建类 三.写代码(基本语法) 1.代码操作 2.代码规范 3.代码注释 一.介绍eclipse Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其…...

3D模型处理的并行化

今天我们将讨论如何使用 Python 多进程来处理大量3D数据。 我将讲述一些可能在手册中找到的一般信息&#xff0c;并分享我发现的一些小技巧&#xff0c;例如将 tqdm 与多处理 imap 结合使用以及并行处理存档。 那么我们为什么要诉诸并行计算呢&#xff1f; 使用数据有时会出现…...

盲人安全导航技巧:科技赋能让出行更自如

作为一名资深记者&#xff0c;长期关注并报道无障碍领域的发展动态。今日&#xff0c;我将聚焦盲人安全导航技巧&#xff0c;探讨这一主题下科技如何赋能视障人士实现更为安全、独立的出行。一款融合了实时避障、拍照识别物体及场景功能的盲人出行辅助应用叫做蝙蝠避障&#xf…...

问,由于java存在性能上,以及部分功能上的缺点,请问如何正确使用C,C++,Go,这三个语言,提升Java Web项目的性能?

拓展阅读&#xff1a;版本任你发&#xff0c;我用java8 我明白Java虽然在许多方面表现出色&#xff0c;但在某些特定场景下可能会遇到性能瓶颈或功能限制。为了提升Java Web项目的性能&#xff0c;可以考虑将C、C和Go这三种语言用于特定的组件或服务。以下是如何正确使用这些语…...

【信号与系统 - 9】傅里叶变换的性质习题

1 习题 已知 f ( t ) f(t) f(t) 的傅里叶变换为 F ( j w ) F(jw) F(jw) &#xff0c;求如下信号的傅里叶变换 &#xff08;1&#xff09; t ⋅ f ( 3 t ) t\cdot f(3t) t⋅f(3t) 解&#xff1a; f ( 3 t ) ↔ 1 3 F ( j w 3 ) f(3t)\leftrightarrow \frac{1}{3}F(j\frac{w}…...

C#探索之路基础夯实篇(5):语法糖概念解析

C#探索之路基础夯实篇(5)&#xff1a;语法糖概念解析 文章目录 C#探索之路基础夯实篇(5)&#xff1a;语法糖概念解析1、概念定义2、Lua中的语法糖3、C#中的语法糖4、C中的语法糖5、优缺点辨析6、适用范围7、总结 从之前一开始接触lua的时候开始&#xff0c;开始第一次接触到语法…...

SeaTunnel 与 DataX 、Sqoop、Flume、Flink CDC 对比

产品概述 Apache SeaTunnel 是一个非常易用的超高性能分布式数据集成产品,支持海量数据的离线及实时同步。每天可稳定高效同步万亿级数据,已应用于数百家企业生产,也是首个由国人主导贡献到 Apache 基金会的数据集成顶级项目。 SeaTunnel 主要解决数据集成领域的常见问题:…...

深入理解汇编:平栈、CALL和RET指令详解

​视频学习下载地址&#xff1a;​​https://pan.quark.cn/s/04e6946a803a​​ 汇编语言以其接近硬件的特性和高效的执行速度&#xff0c;在系统编程、性能优化和逆向工程中占有不可或缺的地位。本文将深入探讨汇编语言中的平栈操作以及​​CALL​​​和​​RET​​指令&#…...

DP4 最小花费爬楼梯

原题链接&#xff1a;最小花费爬楼梯_牛客题霸_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 dp。 开一个dp数组和a数组。dp[i]表示在当前这一格所需要的费用&#xff0c;a数组其实就是题目中的cost数组。 因为最后要求到顶楼的最低费用&a…...

OpenXR API概览与核心组件解析

在虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;领域&#xff0c;OpenXR API提供了一个重要的开放标准&#xff0c;使得开发者能够跨多种硬件和软件平台创建兼容的应用。本文将详细解释OpenXR中的核心组件和数据结构&#xff0c;并探讨它们如何共同…...

安装指定版本的ant-design-vue和指定版本的@ant-design/icons-vue 图标组件包

前言&#xff1a; 最近在完成公司的项目时&#xff0c;为了兼容其他的版本&#xff0c;需要安装指定版本的ant-design-vue和ant-design/icons-vue 图标组件包&#xff0c;安装成功之后&#xff0c;分享如下&#xff1a; 安装命令&#xff1a; ant-design-vue&#xff1a; 不…...

Zynq7000系列中的休眠模式

休眠模式是在系统层面定义的&#xff0c;它包括将APU置于待机模式&#xff0c;并将多个控制器保持在无时钟的复位状态。 进入休眠模式可以大大降低功耗。在休眠模式下&#xff0c;大多数功能时钟组都会被关闭或断电。唯一需要保持活动的设备是一个CPU、窥探控制单元&#xff08…...

在redhat7/8平台上部署ELK7.17.18的技术方案

部署环境说明 为节省资源直接使用1台测试机模拟3节点elasticsearch服务集群做部署&#xff0c;在该主机上同时部署了3个elasticsearch实例、1个logstash实例、1个kibana实例、1个filebeat实例。对于生产环境&#xff0c;以上实例服务应该做分布式部署。 ELK-TEST1 192.168.10…...

(Chat For Al,创新Al,汇语Al助手,AiTab新标签,万能助手,LLaVA)分享6个好用的ChatGPT

目录 1、Chat For AI 2、创想AI 3、汇语AL助手...

MySQL-锁篇

文章目录 表级锁和行级锁了解吗&#xff1f;有什么区别&#xff1f;行级锁使用有什么注意事项&#xff1f;InnoDB有哪几类行锁&#xff1f;共享锁和排他锁是什么&#xff1f;意向锁有什么用&#xff1f; 锁是一种常见的并发事务的控制方式 表级锁和行级锁了解吗&#xff1f;有什…...

滤波器笔记(杂乱)

线性相位是时间平移&#xff0c;相位不失真 零、基础知识 1、用相量表示正弦量 https://zhuanlan.zhihu.com/p/345546880 https://www.zhihu.com/question/347763932/answer/1103938667 A s i n ( ω t θ ) ⇔ A e j θ ⇔ A ∠ θ Asin(\omega t\theta) {\Leftrightarrow…...

【ARFoundation自学01】搭建AR框架,检测平面点击位置克隆物体

Unity开发ARFoundation相关应用首先安装ARFoundation包 然后设置XR 1.基础AR场景框架搭建 2.一个基本的点击克隆物体到识别的平面脚本 挂在XROrigin上 脚本AppController 脚本说明书 ## 业务逻辑 AppController 脚本旨在实现一个基本的 AR 应用程序功能&#xff1a;用户通过…...

.Net ajax 接收参数

后端部分代码 一般处理程序 public void ProcessRequest(HttpContext context){context.Response.ContentType "text/plain";string str_index context.Request.Form.AllKeys.Contains("index") ? context.Request.Form["index"].ToString(…...

智能零售:引领购物新时代

智能零售通过整合人工智能、物联网、大数据和机器学习等技术&#xff0c;正在彻底改变传统的购物模式&#xff0c;为消费者和零售商提供前所未有的效率和个性化体验。 智能零售利用消费者数据分析来提供个性化的购物推荐。无论是在线平台或是实体店内&#xff0c;智能系统都能…...

【AIGC】AIGC在虚拟数字人中的应用:塑造未来互动体验的革新力量

&#x1f680; &#x1f680; &#x1f680;随着科技的快速发展&#xff0c;AIGC已经成为引领未来的重要力量。其中&#xff0c;AIGC在虚拟数字人领域的应用更是引起了广泛关注。虚拟数字人作为一种先进的数字化表达形式&#xff0c;结合了3D建模、动画技术、人工智能等多种先进…...

电机控制器电路板布局布线参考指导(五)

电机控制器电路板布局布线参考指导&#xff08;五&#xff09;大容量电容和旁路电容的放置 1.大容量电容的放置2.电荷泵电容器3.旁路电容/去耦电容的放置3.1 靠近电源3.2 靠近功率器件3.3 靠近开关电流源3.4 靠近电流感测放大器3.5 靠近稳压器 tips&#xff1a;资料主要来自网络…...

Python医院挂号脚本

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…...

LabVIEW光学探测器板级检测系统

LabVIEW光学探测器板级检测系统 特种车辆乘员舱的灭火抑爆系统广泛采用光学探测技术来探测火情。光学探测器作为系统的关键部件&#xff0c;其探测灵敏度、响应速度和准确性直接关系到整个系统的运行效率和安全性。然而&#xff0c;光学探测器在长期使用过程中可能会因为灰尘污…...

女上司问我:误删除PG百万条数据,可以闪回吗?

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验 擅长主流数据Oracle、MySQL、PG、openGauss运维 备份恢复&#xff0c;安装迁移&#xff0c;性能优化、故障应急处理等可提供技术业务&#xff1a; 1.DB故障处理/疑难杂症远程支援 2.Mysql/PG/Oracl…...

HarmonyOS4-数据持久化

轻量级preferences&#xff1a; 关系型数据库&#xff1a; 增删改&#xff1a; 查询语句&#xff1a; 具体详情代码可参与源码&#xff1a; 黑马大佬写的。 harmonyos-lessons: 黑马程序员B站HarmonyOS课程的基础篇代码部分...

深度学习的社交网络:用户行为分析

1.背景介绍 社交网络是当今互联网的一个重要领域,它们为人们提供了一种快速、便捷的方式来与他人交流、分享信息和建立社交关系。社交网络的数据量巨大,包括用户的个人信息、互动记录、内容等。这些数据为企业和组织提供了丰富的信息来源,可以用于用户行为分析、推荐系统、…...

关键词seo优化排名/百度关键字优化价格

C动态分配数组和释放使用new和delete两个关键字 //C动态分配一维数组和释放 int n; cin>>n; int *arraynew int[n]; //动态分配一维数组delete []array; //释放//C动态分配二维数组和释放 int n; cin>>n; int i; int **array; /…...

服装网站建设定制/百度收录权重

tags: web前端库 基于easyUI开发的一个综合案例模版 <% page language"java" pageEncoding"UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>练习</title>&…...

注册公司需要多久/seo培训机构哪家好

文中大部分中心思想来源于Event Processing In Action一书的9.4节。 模式识别器的基本策略是&#xff1a;所有时间窗内的事件被称为候选事件&#xff08;Participant Events&#xff09;&#xff0c;再由候选事件根据规则产生匹配集&#xff08;Matching Set&#xff09;。 1. …...

html5个人网页代码大全/怎么优化标题和关键词排名

环境&#xff1a; &nbsp&nbspVisual Studio 2010 一、Mindscape.NhibernateModelDesigner安装 &nbsp&nbsp在打开VS2010之后&#xff0c;我们可以在“工具”菜单下找到“扩展管理器&#xff0c;搜索&#xff1a;Mindscape NHibernate Model Designer 下载安装即…...

网站建设和优化排名/百度一下首页手机版

在当今的移动盛世&#xff0c;谈论APP“生存”话题未免太过沉重。但面对百万级移动应用大军所产生的激烈竞争&#xff0c;且保证“立而不倒”&#xff0c;这样的探讨就显得格外重要了。 主打“价值牌”才能“一条龙” 有这样一组数据&#xff0c;在我国&#xff0c;APP只被打开…...

百度一下做网站/数据分析网官网

题意 给你n个数&#xff0c;然后询问l,r区间能构成三角形的最大周长是多少&#xff1f; 链接 [http://acm.hdu.edu.cn/showproblem.php?pid6601] 分析 因为a<1e9所以不超过44个斐波那契数&#xff0c;无论什么区间最多在那个范围内判断即可 也就是你要找某个区间的前四十五…...