在 Java 中,throws 和 throw 是两个不同的关键字,它们的作用和用法也不一样

本文深入探讨了Java中的异常处理,包括throws用于声明方法可能抛出的受检查异常,throw用于手动抛出异常。同时,介绍了类加载的三个步骤:加载、连接(验证、准备、解析)和初始化。还详细讲解了Java反射机制的三种实现方式,并举例说明了如何调用私有方法。此外,文章还涵盖了异常的分类,如编译期异常和运行时异常,以及如何获取异常信息。最后,讨论了异常处理的基本原则,包括何时使用throws和throw关键字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. throws:用于定义一个方法可能会抛出哪些受检查异常(Checked Exception)。当一个方法可能会抛出一个或多个受检查异常时,可以在方法声明和实现的部分使用 throws 关键字来列举可能会抛出的异常,以便通知调用者需要对受检查异常进行处理或者传递。
  2. throw:用于在程序中手动抛出一个异常。当程序出现了某种意外或者异常情况时,可以用 throw关键字来创建一个异常对象并将其抛出,从而引起程序的异常处理机制的工作。throw 通常用于抛出已定义好的异常;也可以通过创建新的异常类来自定义异常并抛出。
    总之,throws 和 throw 是 Java 中两个不同的关键字,用于不同的场合。throws 主要用于定义方法可能会抛出哪些受检查异常;而 throw 则用于手动抛出一个异常对象,以引发异常处理机制的工作。两者虽然名称相似,但它们的作用和用法是完全不同的。
    首先;当程序要使用某个类时,如果该类还未被加载到内存,则系统通过加载(通过类加载器完成),连接,初始化实现对这个类的加载。加载:就是指将class文件读入内存,并为之创建一个Class对象,任何类被使用时都会建立一个Class对象。连接:验证:是否有正确的内部结构,并和其他类协调一致,准备:负责为类的静态成员分配内存,并设置默认初始化设置,解析:将类的二进制数据中的符号引用替换为直接引用。初始化就是创建对象的过程。
    throws与throw 的区别:
    throws
    用在方法声明后面,跟的是异常类名,可以跟很多个异常类名,用逗号隔开, 表示抛出异常,由该方法调用者处理,throws表示出现异常的一种可能性,并不一定发生这些异常
    throw
    用在方法体内,跟的是异常对象, 只能抛出一个异常对象名, 表示抛出异常,由方法体内的语句处理,执行throw一定抛出了某种异常。

反射有三种实现方法:
第一种方法,forName()静态方法:Class.forName(String str);
// 注意:str - 所需类的完全限定名。
Class class1 = Class.forName(“com.mzsds.fanshe.fanshe”);
// 第二种方法,.class
Class class2 = String.class;
// 第三种方法,.getClass();
fanshe fs = new fanshe();
Class class3 = fs.getClass();
最后:利用反射可以调用类的私有方法,也可以调用父类的私有方法,当调用父类的私有方法时需要特殊处理,因为可能获取不到,以下为转载的链接
注意调用私有成员前要 constructor/Field/method(各种对象).setAccessible(true);
通过反射可以绕过泛型检查,比如ArrayList<String>的add方法添加int。
ArrayList<Integer> arr = new ArrayList<Integer>();
Class c = arr.getClass();
Method m = c.getMethod(“add”, Object.class);
m.invoke(arr, “hello”);
m.invoke(arr, “world”);
m.invoke(arr, “java”);
System.out.println(arr);
Proxy类是一个代理类 需要自己实现一个InvocationHandler的自定义类。自定义类实现invoke方法,Proxy类调用newProxyInstance方法。类似中介设计模式。

异常处理
Throwable类是所有异常类的超类,该类的两个直接子类是Error和Exception。其中Error及子类用于指示合理的应用程序不应该试图捕获的严重问题,Expection及其子类给出了合理应用程序需要捕获的异常。而expection又分为编译期异常和运行时异常。runtimeException及其子类是运行时异常(可以不处理),其他为编译器异常(必须处理)。
可控式异常:
IOExpection:当发生某种I/0异常时,抛出此异常
SQLExpection:提供关于数据库访问错误的其他错误信息异常
ClassNotFoundExpection:没找到类的异常
NoSuchFieldExpection:类不包含指定的字段
NoSuchMethodExpection:无法找到某一特定方法,抛出该异常。
运行时异常:
IndexOutofBoundsExpection:数组或者集合超出界限,
NullPointerExpection:访问对象为null时的异常
ArithmeticExpection:异常的运算条件时的异常,
IllegalArgumentExpection:表明向方法传递了一个不合法或者不正确的参数
ClassCastExpection:当试图讲对象转换为不是实例的子类时抛出该异常。
获取异常信息:
getlocalizedMessage()返回Throwable的本地化描述,
getMessage()获取此throwable的详细信息字符串 ,
printStackTrace()将此Throwable及其栈踪迹输出至标准错误流
tostring()获取此throwable的剪短描述
在一个方法的运行过程中,如果发生了异常,则Java虚拟机生成一个代表该异常的对象(它包含了异常的详细信息),并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。我们把生成异常对象并把它提交给运行时系统的过程称为抛出(throw)一个异常。
异常处理方法A:有些时候我们处理不了异常,我们就用throws抛出异常, 格式:放在方法后面 throws 异常类名。抛出后谁调用 谁需要用try cath 处理 或者继续往上抛。这里指的是编译时异常,如果抛出的是运行时异常,则不用管。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bol5261

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值