「java反射类处理异常」Java反射异常
本篇文章给大家谈谈java反射类处理异常,以及Java反射异常对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、java使用反射获取方法为什么会报这个异常
- 2、在java中常出现的异常和解决方法?
- 3、java 反射调用出错!请教高手这个为什么会报错呢?
- 4、java反射中的java.lang.InstantiationException:异常,求解决
- 5、java反射机制详解
- 6、JAVA反射为什么总要异常处理?
java使用反射获取方法为什么会报这个异常
试一试下面的内容:
public class ReflectTest
{
/**
* @param args
*/
public static void main(String[] args) throws NoSuchMethodException,
SecurityException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException
{
/** 下面是想用反射获取getNumber方法 **/
Student s = new Student();
Class c = s.getClass();
// Class[] cs = new Class[1];
// cs[0] = String.class;
Method m = c.getDeclaredMethod("getNumber", String.class);
System.out.println(m.invoke(new Student(), "123"));
}
}
2.另外,一般这个反射获得方法的方式是针对私有方法的,而不是公有方法。
在java中常出现的异常和解决方法?
1. java.lang.nullpointerexception
这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。对数组操作中出现空指针,很多情况下是一些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的初始化混淆起来了。数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个元素都进行初始化(如果要调用的话)
2. java.lang.classnotfoundexception
这个异常是很多原本在jb等开发环境中开发的程序员,把jb下的程序包放在wtk下编译经常出现的问题,异常的解释是"指定的类不存在",这里主要考虑一下类的名称和路径是否正确即可,如果是在jb下做的程序包,一般都是默认加上package的,所以转到wtk下后要注意把package的路径加上。
3. java.lang.arithmeticexception
这个异常的解释是"数学运算异常",比如程序中出现了除以零这样的运算就会出这样的异常,对这种异常,大家就要好好检查一下自己程序中涉及到数学运算的地方,公式是不是有不妥了。
4. java.lang.arrayindexoutofboundsexception
这个异常相信很多朋友也经常遇到过,异常的解释是"数组下标越界",现在程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了,还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明的,这个时候,最好先查看一下数组的length,以免出现这个异常。
5. java.lang.illegalargumentexception
这个异常的解释是"方法的参数错误",很多j2me的类库中的方法在一些情况下都会引发这样的错误,比如音量调节方法中的音量参数如果写成负数就会出现这个异常,再比如g.setcolor(int red,int green,int blue)这个方法中的三个值,如果有超过255的也会出现这个异常,因此一旦发现这个异常,我们要做的,就是赶紧去检查一下方法调用中的参数传递是不是出现了错误。
6. java.lang.illegalaccessexception
这个异常的解释是"没有访问权限",当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。对程序中用了package的情况下要注意这个异常。
其他还有很多异常,我就不一一列举了,我要说明的是,一个合格的程序员,需要对程序中常见的问题有相当的了解和相应的解决办法,否则仅仅停留在写程序而不会改程序的话,会极大影响到自己的开发的。关于异常的全部说明,在api里都可以查阅。
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException
操作数据库异常:SQLException
输入输出异常:IOException
方法未找到异常:NoSuchMethodException
java.lang.AbstractMethodError
抽象方法错误。当应用试图调用抽象方法时抛出。
java.lang.AssertionError
断言错。用来指示一个断言失败的情况。
java.lang.ClassCircularityError
类循环依赖错误。在初始化一个类时,若检测到类之间循环依赖则抛出该异常。
java.lang.ClassFormatError
类格式错误。当Java虚拟机试图从一个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时抛出。
java.lang.Error
错误。是所有错误的基类,用于标识严重的程序运行问题。这些问题通常描述一些不应被应用程序捕获的反常情况。
java.lang.ExceptionInInitializerError
初始化程序错误。当执行一个类的静态初始化程序的过程中,发生了异常时抛出。静态初始化程序是指直接包含于类中的static语句段。
java.lang.IllegalAccessError
违法访问错误。当一个应用试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。
java.lang.IncompatibleClassChangeError
不兼容的类变化错误。当正在执行的方法所依赖的类定义发生了不兼容的改变时,抛出该异常。一般在修改了应用中的某些类的声明定义而没有对整个应用重新编译而直接运行的情况下,容易引发该错误。
java.lang.InstantiationError
实例化错误。当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常.
java.lang.InternalError
内部错误。用于指示Java虚拟机发生了内部错误。
java.lang.LinkageError
链接错误。该错误及其所有子类指示某个类依赖于另外一些类,在该类编译之后,被依赖的类改变了其类定义而没有重新编译所有的类,进而引发错误的情况。
java.lang.NoClassDefFoundError
未找到类定义错误。当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。
java.lang.NoSuchFieldError
域不存在错误。当应用试图访问或者修改某类的某个域,而该类的定义中没有该域的定义时抛出该错误。
java.lang.NoSuchMethodError
方法不存在错误。当应用试图调用某类的某个方法,而该类的定义中没有该方法的定义时抛出该错误。
java.lang.OutOfMemoryError
内存不足错误。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。
java.lang.StackOverflowError
堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。
java.lang.ThreadDeath
线程结束。当调用Thread类的stop方法时抛出该错误,用于指示线程结束。
java.lang.UnknownError
未知错误。用于指示Java虚拟机发生了未知严重错误的情况。
java.lang.UnsatisfiedLinkError
未满足的链接错误。当Java虚拟机未找到某个类的声明为native方法的本机语言定义时抛出。
java.lang.UnsupportedClassVersionError
不支持的类版本错误。当Java虚拟机试图从读取某个类文件,但是发现该文件的主、次版本号不被当前Java虚拟机支持的时候,抛出该错误。
java.lang.VerifyError
验证错误。当验证器检测到某个类文件中存在内部不兼容或者安全问题时抛出该错误。
java.lang.VirtualMachineError
虚拟机错误。用于指示虚拟机被破坏或者继续执行操作所需的资源不足的情况。
java.lang.ArithmeticException
算术条件异常。譬如:整数除零等。
java.lang.ArrayIndexOutOfBoundsException
数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。
java.lang.ArrayStoreException
数组存储异常。当向数组中存放非数组声明类型对象时抛出。
java.lang.ClassCastException
类造型异常。假设有类A和B(A不是B的父类或子类),O是A的实例,那么当强制将O构造为类B的实例时抛出该异常。该异常经常被称为强制类型转换异常。
java.lang.ClassNotFoundException
找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。
java.lang.CloneNotSupportedException
不支持克隆异常。当没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常。
java.lang.EnumConstantNotPresentException
枚举常量不存在异常。当应用试图通过名称和枚举类型访问一个枚举对象,但该枚举对象并不包含常量时,抛出该异常。
java.lang.Exception
根异常。用以描述应用程序希望捕获的情况。
java.lang.IllegalAccessException
违法的访问异常。当应用试图通过反射方式创建某个类的实例、访问该类属性、调用该类方法,而当时又无法访问类的、属性的、方法的或构造方法的定义时抛出该异常。
java.lang.IllegalMonitorStateException
违法的监控状态异常。当某个线程试图等待一个自己并不拥有的对象(O)的监控器或者通知其他线程等待该对象(O)的监控器时,抛出该异常。
java.lang.IllegalStateException
违法的状态异常。当在Java环境和应用尚未处于某个方法的合法调用状态,而调用了该方法时,抛出该异常。
java.lang.IllegalThreadStateException
违法的线程状态异常。当县城尚未处于某个方法的合法调用状态,而调用了该方法时,抛出异常。
java.lang.IndexOutOfBoundsException
索引越界异常。当访问某个序列的索引值小于0或大于等于序列大小时,抛出该异常。
java.lang.InstantiationException
实例化异常。当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常。
java.lang.InterruptedException
被中止异常。当某个线程处于长时间的等待、休眠或其他暂停状态,而此时其他的线程通过Thread的interrupt方法终止该线程时抛出该异常。
java.lang.NegativeArraySizeException
数组大小为负值异常。当使用负数大小值创建数组时抛出该异常。
java.lang.NoSuchFieldException
属性不存在异常。当访问某个类的不存在的属性时抛出该异常。
java.lang.NoSuchMethodException
方法不存在异常。当访问某个类的不存在的方法时抛出该异常。
java.lang.NullPointerException
空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等。
java.lang.NumberFormatException
数字格式异常。当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。
java.lang.RuntimeException
运行时异常。是所有Java虚拟机正常操作期间可以被抛出的异常的父类。
java.lang.SecurityException
安全异常。由安全管理器抛出,用于指示违反安全情况的异常。
java.lang.StringIndexOutOfBoundsException
字符串索引越界异常。当使用索引值访问某个字符串中的字符,而该索引值小于0或大于等于序列大小时,抛出该异常。
java.lang.TypeNotPresentException
类型不存在异常。当应用试图
java 反射调用出错!请教高手这个为什么会报错呢?
从异常可以看到:can not access a member of class java.util.HashMap$HashIterator with modifiers "public final"
说明运行时的被反射类其实是 java.util.HashMap$HashIterator ,(也可以看出HashSet是通过HashMap来实现的),查看jdk的源码,可以看到:
private abstract class HashIteratorE implements IteratorE {
。。。
}
这个是私有内部类,不允许外边访问。所以报了这个非法访问异常
java反射中的java.lang.InstantiationException:异常,求解决
用错KEY来实例化了,用VALUE来实例化
String val = prop.getProperty(name);
objectPool.put(name, createObject(val));
java反射机制详解
反射就是把Java的各种成分映射成相应的Java类。
Class类的构造方法是private,由JVM创建。
反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取他所有的成员变量和方法并且显示出来。Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal、C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息。(来自Sun)
JavaBean 是 reflection 的实际应用之一,它能让一些工具可视化的操作软件组件。这些工具通过 reflection 动态的载入并取得 Java 组件(类) 的属性。
反射是从1.2就有的,后面的三大框架都会用到反射机制,涉及到类"Class",无法直接new CLass(),其对象是内存里的一份字节码.
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
基本的 Java类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。Class 没有公共构造方法。
Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。
Person p1 = new Person();
//下面的这三种方式都可以得到字节码
CLass c1 = Date.class();
p1.getClass();
//若存在则加载,否则新建,往往使用第三种,类的名字在写源程序时不需要知道,到运行时再传递过来
Class.forName("java.lang.String");
Class.forName()字节码已经加载到java虚拟机中,去得到字节码;java虚拟机中还没有生成字节码 用类加载器进行加载,加载的字节码缓冲到虚拟机中。
另外,大家可以关注微信公众号Java技术栈回复:JVM,获取我整理的系列JVM教程,都是干货。
考虑下面这个简单的例子,让我们看看 reflection 是如何工作的。
import java.lang.reflect.*;
public class DumpMethods {
public static void main(String args[]) {
try {
Class c = Class.forName("java.util.Stack");
Method m[] = c.getDeclaredMethods();
for (int i = 0; i m.length; i++)
System.out.println(m[i].toString());
}
catch (Throwable e){
System.err.println(e);
}
}
}
public synchronized java.lang.Object java.util.Stack.pop()
public java.lang.Object java.util.Stack.push(java.lang.Object)
public boolean java.util.Stack.empty()
public synchronized java.lang.Object java.util.Stack.peek()
public synchronized int java.util.Stack.search(java.lang.Object)
这样就列出了java.util.Stack 类的各方法名以及它们的限制符和返回类型。这个程序使用 Class.forName 载入指定的类,然后调用 getDeclaredMethods 来获取这个类中定义了的方法列表。java.lang.reflect.Methods 是用来描述某个类中单个方法的一个类。
以下示例使用 Class 对象来显示对象的类名:
void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}
还可以使用一个类字面值(JLS Section 15.8.2)来获取指定类型(或 void)的 Class 对象。例如:
System.out.println("The name of class Foo is: "+Foo.class.getName());
在没有对象实例的时候,主要有两种办法。
//获得类类型的两种方式
Class cls1 = Role.class;
Class cls2 = Class.forName("yui.Role");
注意第二种方式中,forName中的参数一定是完整的类名(包名+类名),并且这个方法需要捕获异常。现在得到cls1就可以创建一个Role类的实例了,利用Class的newInstance方法相当于调用类的默认的构造器。
Object o = cls1.newInstance();
//创建一个实例
//Object o1 = new Role(); //与上面的方法等价
JAVA反射为什么总要异常处理?
JAVA中的异常和反射
一、异常
1
、异常概貌:
概念: JAVA 会将所有的异常、错误抽象成为一个类,其根本父类为Throwable。异常是程
序中所有出乎意料的结果,用名称代表发生的问题,见名知义。我们对于程序可能出现的错
误应该做出预案。异常处理可以提高我们系统的容错性、健壮性。
java.lang.Throwable 类是所有异常和错误的顶层类。其两个直接子类是java.lang.Error 和
java.lang.Exception。
Error
对象表示程序错误,是底层的、不可恢复的严重错误。此时程序一定会退出,
已经失去了运行所必须的物理环境。因为程序已经退出了,所以对于Error 错误无法进
行处理。
我们可处理的只是Exception
类的对象表示的程序异常(例外/异常)。
以下区分:
RuntimeException
(未检查异常):RuntimeException 及其子类都称为运行时异常,它
是(UnChecked Exception),特点是Java 编译器不会检查它,可以在编程时避免。也就
是说,当程序中出现此类异常时,即使不用try…catch 捕获,或不用throws 子句抛出,
还是可以编译通过。比如,除数为0 的异常ArrithmeticException,就是运行时异常。
非Runtime
异常(已检查异常):包括除了RuntimeException及其子类外的其它Exception
类及其子类,都属于已检查异常(Checked Exception)。其特点是Java 编译器会检查它,
我们需要用try…catch 语句捕获,或用throws 子句声明抛出,否则编译不会通过。比如
打开文件时找不到文件,就属于已检查异常。
Throwable
Error
错误
严重底层错误
不可避免
不可处理
Exception
异常
RuntimeException
未检查异常
(可处理可不处理)
比如除0 错误、空指针
非Runtime
已检查异常
(必须处理)
比如打开文件时找不到
2
2
、Java
异常处理机制
(1
)try
…
catch
捕获异常(积极处理异常的方式)
try 代码块包含了可能发生异常的程序代码,catch 块紧随其后,用来捕获并处理异常。
格式如下:
try
{
可能出现异常的代码块}
catch
(Exception
e)
{
进行异常处理}
注意:一次异常捕获只会匹配一次try…catch
catch 中要求必须先捕获子类异常再捕获父类异常。
(2
)finally
任何情况下都必须执行的代码段(紧接在try 或catch 代码块后面)。
finally 无论如何都会被执行,除非JVM 退出。所以,finally 代码块常常用于释放被占
用的资源。比如关闭文件、网络、数据库连接等。
(3
)throws
声明可能会抛出的异常(消极处理异常的方式)
格式: 方法名(参数表)throws
后面接要往上抛的异常。
表示该方法对指定的异常不作任何处理,直接抛往上一层。
static void methodA(int i) throws IOException{ //一直向上抛(消极处理)
}
public static void main(String[] args) throws IOException{ //一直抛到JVM
}
多个异常,用逗号隔开。throws IOException, SQLException
throws 后的异常允许多态。比如IOException,会包括抛出其子类。
注意:不允许子类比父类抛出范围更大、更多的异常。
方法覆盖时,修饰符要越来越宽;抛例外则要越来越窄。
throws
和try
…
catch
经常配合使用,把异常传递给最能处理此异常的方法中,体现各
司其职的特点。
Java
中处理异常方式
消极throws 用在方法的声明上
积极try…catch…finally
public static int fn(int b){
try{
return b/2;
}catch(Exception e){
return 0;
}finally{
return b; //返回的结果是一定是b;
}
}
3
(4
)throw
抛出异常
打个比方:
public void eat() throws FoodException{ //自定义FoodException 是以下异常的父类
if(没有食物) throw new NoFoodException(“呵呵,没有食物”);
if(发现苍蝇) throw new FoundFlyException(“哎呀,发现半只苍蝇”);
}
比较throw
和throws
:
throw
是一个语句,它出现在方法体中,用来抛出异常对象。
throws
是出现在方法声明中,表示本方法中会有异常对象向上(调用者)抛出。
throws
后写的是异常类型; throw
后写的是要抛出的异常对象。
(5
)异常处理流程
try…catch…finally,如果遇到return 和System.exit()语句:
一如果在finally 之前遇到System.exit()则finally 语句不再执行,这是finally 不被执行
的唯一情况。因为java.lang.System类的静态方法exit()用于终止当前的Java 虚拟机进程。exit()
的参数表示程序终止时的状态码,0 表示正常终止,非0 表示异常终止。
二return 语句用于退出本方法。如果在try 或者catch 代码块中遇到return 语句时,若
有finally 语句块,会先执行finally 代码块。
三不要在finally 代码块中使用return 语句。因为这样会导致两种潜在错误:A. 覆盖了
try 或catch 块中的return 语句; B. 导致丢失异常。
try{
①
②
③
} catch(XxxException e) {
④
} finally {
⑤
}
⑥
情况一:没有异常,处理顺序为① ② ③ ⑤ ⑥
情况二:在②处有异常,① ② ④ ⑤ ⑥
情况三:有异常,没有被捕获,① ② ⑤ 终止
情况四:如果③后有return 语句,① ② ③ ⑤
情况五:如果遇到System.exit(),则⑤不执行
允许的处理方式:
① try…catch()
② try…finally //与throws 配合使用
③ try…catch…finally
④ try…catch(){} catch(){} … //配多个catch
//注意范围大的异常要写在后面
4
(6
)异常处理规则:
① 只有在异常情况下才使用异常处理机制;
② 保证操作要么一起成功,要么一起失败;
③ try 代码块不要太大;
④ catch 子句中指定具体的异常类型;
⑤ 早抛出,晚捕获。
3
关于java反射类处理异常和Java反射异常的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-11-26,除非注明,否则均为
原创文章,转载请注明出处。