Java异常再处理不了,我就把你当异常给try-catch了

  • NullPointerException (空指针异常):指针指向的对象为空(null)

  • ArrayIndexOutOfBoundException (数组角标越界异常) StringIndexOutOfBoundException (字符串越界异常) …

  • ClassCastException (类型转换异常)

2.2. 编译时异常 (编译时异常必须进行处理否则无法运行)

  • IOException

FileNotFoundException

  • ClassNotFoundException

2.3. 常见异常的运行Demo

package com.broky.exception.commonException;

import java.util.Scanner;

public class CommonEx {

static void ArithmeticExceptionDemo(){

int a = 10;

int b = 0;

int c = a / b;

/*Exception in thread “main” java.lang.ArithmeticException: / by zero

at com.broky.exception.ArithmeticEx.main(ArithmeticEx.java:7)*/

}

static void ClassCastExceptionDemo(){

Object obj = new Double(1);

String str = (String)obj;

/*Exception in thread “main” java.lang.ClassCastException: class java.lang.Double cannot be cast to class java.lang.String (java.lang.Double and java.lang.String are in module java.base of loader ‘bootstrap’)

at com.broky.exception.ClassCastEx.main(ClassCastEx.java:7)*/

}

static void InputMismatchExceptionDemo(){

Scanner scan = new Scanner(System.in);

int num = scan.nextInt();

System.out.println(num);

/*asd

Exception in thread “main” java.util.InputMismatchException

at java.base/java.util.Scanner.throwFor(Scanner.java:939)

at java.base/java.util.Scanner.next(Scanner.java:1594)

at java.base/java.util.Scanner.nextInt(Scanner.java:2258)

at java.base/java.util.Scanner.nextInt(Scanner.java:2212)

at com.broky.exception.InputMismatchEx.main(InputMismatchEx.java:8)*/

}

static void NullPointerExceptionDemo(){

int[] arr = null;

System.out.println(arr[3]);

/*Exception in thread “main” java.lang.NullPointerException: Cannot load from int array because “arr” is null

at com.broky.exception.NullPointerEx.main(NullPointerEx.java:6)*/

}

static void NumberFormatExceptionDemo(){

String str = “abc”;

int a = Integer.parseInt(str);

/*Exception in thread “main” java.lang.NumberFormatException: For input string: “abc”

at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)

at java.base/java.lang.Integer.parseInt(Integer.java:660)

at java.base/java.lang.Integer.parseInt(Integer.java:778)

at com.broky.exception.NumberMismatchEx.main(NumberMismatchEx.java:6)*/

}

static void ArrayIndexOutOfBoundExceptionDemo(){

int[] arr = new int[3];

System.out.println(arr[3]);

/*Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3

at com.broky.exception.XIndexOutOfBoundEx.main(XIndexOutOfBoundEx.java:6)*/

String str = “abc”;

System.out.println(str.charAt(3));

/*Exception in thread “main” java.lang.StringIndexOutOfBoundsException: String index out of range: 3

at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:48)

at java.base/java.lang.String.charAt(String.java:711)

at com.broky.exception.XIndexOutOfBoundEx.main(XIndexOutOfBoundEx.java:11)*/

}

public static void main(String[] args) {

ArrayIndexOutOfBoundExceptionDemo();

}

}

3. 异常的抓抛模型原理


异常的抛出:如果程序在运行过程中执行某段代码时发生了异常,那么系统(JVM)将会根据异常的类型,在异常代码处创建对应的异常类型的对象并抛出,抛出给程序的调用者。一旦抛出对象以后,其后的代码不再运行,程序终止.

异常的抛出分为:① 系统向外抛出异常 ② 手动向外抛出异常(throw)

异常的抓取:异常的抓取可以理解为异常的处理方式, 取有 try-catch-finally 和 throws 两种方式(详情见异常的处理部分)

白嫖资料

4. 异常的处理


4.1. try - catch - finally

将可能出现异常的代码放到try{}中, 运行时, 如果代码发成了异常的话,就会生成一个对应的异常类的对象.

这个产生的异常对象会与catch的异常类型相匹配,匹配成功后就被 catch 捕获,然后运行catch{}中的代码, 一般catch中的代码为处理异常的代码, 比如返回异常的信息和返回异常的详细信息等. 一旦异常处理完成,就会跳出当前的try-catch结构

无论有没有发生异常finally中的代码都会最后被执行

  • catch多个异常类型的时候, 如果有子父类关系,小的范围写上面大的范围写下面; 如果没有子父类关系,谁在上谁在下无所谓.

  • 常用的异常对象处理方式: ① e.getMessage() ② e.printSrackTrace()

  • 在try结构中生命的变量,在出了try结构以后,就不能在被调用。如果想避免这种情况,就需要在try之前声明变量并初始化,在try中赋值。

  • 如果finally里面有return那么返回的一定是finally里面的

  • try-catch-finally结构可以相互嵌套

  • 体会1:使用try-catch-finally处理编译时异常,是让程序在编译时就不再报错,但是运行时仍然有可能报错。相当于我们使用try-catch将一个编译时可能出现的异常,延迟到运行时出现。

  • 体会2:在开发中,运行时异常比较常见,此时一般不用try-catch去处理,因为处理和不处理都是一个报错,最好办法是去修改代码。针对编译时异常,我们一定要考虑异常处理。

package com.broky.exception.demo02;

public class TryCatchFinally {

public static void main(String[] args) {

String str = “abc”;

try {

int i = Integer.parseInt(str);

} catch (NumberFormatException e) {

e.printStackTrace();

} catch (Exception e) {

System.out.println(e.getMessage());

} finally {

System.out.println(“运行完毕”);

}

}

}

4.2. throws + 异常类型

  • throws 一般用于方法中可能存在异常时, 需要将异常情况向方法之上的层级抛出, 由抛出方法的上一级来解决这个问题, 如果方法的上一级无法解决的会就会再将异常向上抛出, 最终会抛给main方法. 这样一来main方法中调用了这个方法的时候,就需要解决这个可能出现的异常.

当然main方法也可以不解决异常, 将异常往上抛出给java虚拟机, 如果java虚拟机也无法解决的话,那么java虚拟机就over了

  • throws + 异常类型写在方法的声明处.指明此方法执行时,可能会抛出的异常类型.

一旦方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。

异常代码的后续的代码,就不再执行!

  • 体会:tyr-catch-fianlly:真正的将异常给处理掉了。throws的方式只是将异常抛给了方法的调用者,并没有真正将异常处理掉。

注意: 将异常向上抛出也算是一种处理异常的方法

白嫖资料

package com.broky.exception;

import java.io.FileNotFoundException;

public class ThrowsEx {

public void setAge2(int age) throws FileNotFoundException {

if (age < 0) {

throw new FileNotFoundException(“输入的年龄小于0”);

}

}

public void TestsetAge2() throws FileNotFoundException {

setAge2(2);

}

public static void main(String[] args) {

try {

ThrowsEx.throwsExTest();

} catch (FileNotFoundException e) {

e.printStackTrace();

}

}

}

5. 重写方法异常抛出的规则


子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型

下面代码中,main方法中向display方法中传入了SuperClass的子类对象.那么到display方法中调用s.method调用的就是SpuerClass的子类SubClass重写的method方法, 如果这个方法抛出的异常范围大于父类SuperClass所抛出的异常的话,那么在display方法中对异常的catch处理就会catch不到这个异常.

package com.broky.exception;

import java.io.FileNotFoundException;

import java.io.IOException;

public class OverrideTest {

public void display(SuperClass s) {

try {

s.method();

} catch (IOException e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

OverrideTest overrideTest = new OverrideTest();

overrideTest.display(new SubClass());

}

}

class SuperClass {

public void method() throws IOException {

System.out.println(“super”);

}

}

class SubClass extends SuperClass {

public void method() throws FileNotFoundException {

System.out.println(“sub”);

}

}

6. 开发中如何选择使用try-catch-finally 还是throws?#


  • 如果分类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用tyr-catch-finally方式处理.

  • 执行的方法中,先后又调用了另外的几个方法,这几个方法是递进关系执行的.我们建议这几个方法使用throws的方式处理.而执行的方法a可以考虑使用try-catch-finally方式进行处理.

因为如果在a方法要调用d方法时,如果在b方法内try-catch,当b方法异常时,并不会给方法a返回所需要的数据.因此最好使用throws将异常集合到一块再处理.

  • 注意: try-catch和throws再方法中不要同时使用,因为只要使用try-catch就已经将异常处理掉了,再throws没有任何意义.

白嫖资料

7. 手动抛出异常 throw#


手动抛出的异常有两种, 分别为运行时异常和编译时异常.

抛出运行时异常时, 可以不用处理抛出的这个异常.

抛出编译时异常时, 必须要处理抛出的这个异常.

详细解析请看下面的代码

package com.broky.exception;

/*Demo

手动抛出异常

自己throw(制造一个异常抛出)

*/

import java.io.FileNotFoundException;

public class ThrowEx {

// 手动抛出运行时异常

public void setAge(int age) {

if (age < 0) {

throw new NullPointerException(“输入的年龄小于0”);

}

}

/*

此方法手动抛出了运行时异常

运行时异常可以不用处理

*/

// 手动抛出编译时异常

public void setAge2(int age) throws FileNotFoundException {

if (age < 0) {

throw new FileNotFoundException(“输入的年龄小于0”);

}

}

/*

此方法手动抛出的了编译时异常

编译时异常需要被处理

这里采用了 throws 这个异常, 也就是说方法并没有处理这个异常, 而是将异常抛给了调用者

这样一来调用了这个方法的人就必须要处理这个异常才可以.

注意: 在这里并不用自己使用 try catch 处理这个异常

自己在方法里抛出异常, 方法再自己处理没有任何作用.

所以方法中的异常需要抛给调用者去处理.

*/

public static void main(String[] args) {

ThrowEx throwEx = new ThrowEx();

throwEx.setAge(-5);

}

}

8. 自定义异常类


  • 继承现有的异常结构:RuntimeExceptiona(不用处理)、Exception(需要处理)

  • 提供全局常量:serialVersionUID

  • 提供重载的构造器

package com.broky.exception;

public class MyException extends RuntimeException{

static final long serialVersionUID = -1234719074324978L;

public MyException(){

}

public MyException(String message){

super(message);

}

public static void main(String[] args) {

throw new MyException(“自定义运行时异常”);

/*Exception in thread “main” com.broky.exception.MyException: 自定义运行时异常

at com.broky.exception.MyException.main(MyException.java:15)*/

}

}

9. 异常处理练习题#


最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-jozheqvI-1714839053249)]

[外链图片转存中…(img-hWpmZWIo-1714839053249)]

[外链图片转存中…(img-bFsNtMSZ-1714839053249)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 28
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值