Java day10

异常

一:异常
异常是改变程序正常执行流程的意外情况。
异常的条件都是应用级别的异常。系统级别
的异常程序员无法处理。
异常:是一个对象,Exception
class Exception{
发生问题的主体(Object)
对问题本身的有效描述(String)
}

二:异常的结构
try{
//可能出现异常的代码

int k= 10/0;


}catch(ExceptionType1 e){
…//针对ExceptionType1类型的异常处理
}catch(ExceptionType2 e){
…//针对ExceptionType2类型的异常处理
}

}finally{
//不管是否碰到异常,都要执行该代码,
//收尾工作(关闭数据库,释放资源…)
}

catch中异常类型小异常放在上面
大异常放在下面

异常:是对象,java.lang.Exception
抛出异常:在try中业务逻辑代码出现异常情况,
系统会自动产生异常对象,将该异
常对象抛出给java运行时环境。
这个过程称之为抛出异常。
捕获异常:java运行时环境接受到异常对象,
会根据异常对象寻找相应的catch块。
这个过程称之为捕获异常。
如果找不到相应的catch块,
将异常对象交给java运行
时环境,JAVA运行时环境会直接中
断应用程序,并且会打印异常栈的信息。
异常栈的信息会知道在哪行代码出现了什么样的异常。
处理异常:异常处理的代码

三:异常的原理
当发生异常的时候,系统将自动抛出异常对象
寻找异常处理代码,如果没有找到,将上抛到
方法的调用处,依次类推,直到抛给虚拟机程序终止。
异常栈可以找到异常真正发生的原因。
main(){
a();
}
a(){
b();
}
b(){
c();
}
c(){
///Exception
}
c()---->b()---->a()---->main()—>JVM
在c()中发生异常,且所有方法都没有异常处理,所有方法的栈区是否被锁定?(会)
有多少方法牵扯进来了,就会有多少方法的栈区被锁定了
方法的嵌套调用是非常危险的,栈区被锁定,会等待着内存的释放
方法的递归调用也是很非常危险的,你不一定知道调用的次数
建议:不要有过分复杂的方法嵌套调用,
不要使用调用次数可能过多的递归算法

getMessage():返回该异常的详细描述字符串
printStackTrack():将该异常的跟踪栈信息输出到标准错误输出

四:异常分类
Exception
uncheck异常(RuntimeException异常):
包含RuntimeException及子类
在编译期的不需要捕获的异常
不可修复的异常,如连接数据库发生异常
不需要继续向下执行。
check异常:在编译期的必须捕获的异常
可以修复的异常,如输入错误金额,用户名输入错误。处理之后可以继续向下执行。
Exception的子类除了RuntimeException。
如Class.forName("")
五:异常处理的方式
1)try—catch:自己处理异常
2)throws:自己不处理异常,抛出调用者处理异常。
原则:如果自己能够处理的异常,
就不要抛出调用者处理异常。

六:自定义异常—自己编写一个异常类
1)在项目中建议不抛出系统异常,
因为异常的类名通常应该包含该异常的有用信息。
应该选择合适的异常类,从而可以明确的描述该异常情况,
就应该选择自定义异常。
2)可以把uncheck异常转化为check异常
可以把check异常转化为uncheck异常
自定义check异常:
class MyException extends Exception
自定义uncheck异常:
class MyException extends RuntimeException

throws 异常类型:方法申明的时候抛出异常
throw 异常对象:方法体中抛出异常

七:断言jdk1.4之后
开发过程中,在需要的时候提供判断功能.
用if判断效率很低,用断言可以提高效率
在AssertTest.java加上断言assert b==0:“my assert error b!=0”;
当条件为true,会执行后面的代码,
当条件为false,会抛出一个异常,异常原因为该字符串的信息。
默认情况下,断言是关闭的,所以在运行的时候打开断言输入vm参数-ea
断言是在1.4版本之后增加的,如果对1.4版本之前的系统进行重写。
需要确认assert是否被用作标识符

八:异常和系统效率
异常处理会影响系统效率,建议只在适当的时候做必要处理

1.返回值是多少?
public int test(){
try{
//int k = 10/0;
int k = 10/1;
return 1;
}catch(Exception e){
return -1;
}finally{
return 0;
}
}
注意:返回值不能finally块。
2.下面的语句哪些是对的?
a.try{}
b.try{}catch(){}
c.try{}finally{}
d.try{}catch(){}finally{}
e.catch(){}
f.finally{}

反射

一.java.util.Properties:以键值成对的方式保存数据。
java.util.Map
java.util.Hashtable
java.util.Properties
外界传入参数:
1)Properties可以查看JVM系统参数
a)获取JVM系统配置
Properties p = System.getProperties();
p.list(System.out);
b)设置JVM系统参数 -D
如:-Dname=briup -Dage=30
获取:Properties p=System.getProperties()
String value=p.getProperties(String key);
2)应用程序参数
main(String[] args){}
获取:第一个数据:args[0]
第二个数据:args[1]

3)使用文件(key=value)
文件名:info.properties
程序中写文件的路径:src/com/briup/reflect/info.properties
Properties p =new Properties();
//加载文件
p.load(new FileInputString(“path”));
//获取文件中的内容
String str=p.getProperties(“key”);

二. 反射 :自描述或者自定义
平时我们照镜子的时候,在镜子中会有自己的影子,
其实java中的反射也是类似的,一个类或者对象通过反
射可以获得自身的对象,该对象是一个java.lang.Class
的对象(就像一个镜像文件)。一个对象或者类获得自身
的Class对象的过程称为反射。
java.lang.Class:是类镜像,镜像对象
Class类镜像的作用可以获取该类和该对象的所有属性,方法
和构造器,以及属性方法和构造器修饰符,修改私有属性的值。
调用方法和调用构造器等等。
Class----实例化----->class-----实例化----->对象
对象------抽象化----->class------抽象化----->Class
抽象:具有相同属性和行为抽象出来
public class Class{
Field[] fileds;
Method[] methods;
Constructor[] cons;
}
反射API:
java.lang.Class
java.lang.reflect.Field
java.lang.reflect.Method
java.lang.reflect.Array
java.lang.reflect.Constructor
class Person{}
Person创建100个对象,创建多少个Person的Class类型对象?
class Person{}
1个,类加载的时候创建Person的Class类型对象。

通过反射操作的步骤:
1)获取类镜像(Class对象),三种方式
a)Class.forName(String className)
b)数据类型.class
c)对象.getClass()
2)通过类镜像实例化对象(不通过new方式创建对象)
Object obj=类镜像对象.newInstance()。
默认会调用class类的无参构造器。
3)通过实例化对象操作属性,方法,构造器
a)获取所有的属性(属性名和修饰符和数据类型)。
b)获取所有的方法(方法名和修饰符和返回值和参数列表)
c)获取所有构造器(名字和修饰符和参数列表)
d)修饰属性的值
e)调用方法:invoke()
f)调用指定构造器创建的对象

什么时候用反射:
1)在运行的时候才知道类名
2)在运行的时候才知道属性名
3)在运行的时候才知道方法名
反射:
1) 确定一个对象的class
2) 可以获得一个类的修饰符、字段、方法、构造器和父类。
3) 获得接口声明的常量和方法。
4) 创建Class的实例,直到运行时才获得。
5) 运行前即使字段名字不知道,可以到程序运行时获得和修改这些字段的值。
6) 运行前即使对象的方法名不知道,可以到程序运行时触发调用该方法。
7) 运行前创建了一个大小和元素都未知的新数组,
可以到运行时修改数组的元素。

反射的用途:
1)修改私有属性的值
2)调用任何对象的任何方法
3)不通过new方式创建对象

反射用途的注意:
1)反射可以让我们利用这个Class对象来获取和
修改私有的变量和方法,不通过共有的方法去
获得(原来我们例子都是通过一个public的方
法来设置和获取私有的变量),可以破坏数据
的封装性。
2)反射机制通过在运行时探查字段和方法,
从而可以帮助写出通用性很好的程序,
这项能力对系统编程来说特别有用,
但它并不适合于应用编程。而且,反射是
脆弱的——编译不能帮助你发现编译错误,
任何错误在运行时被发现并且都会导致异常。
导致代码不安全。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值