java中的异常:
异常指的是程序中遇到的非致命的错误,不是语法错误,可以通过编译,但运行时会使程序崩溃. 异常可以是访问的文件不存在,磁盘空间满等等.
针对于异常,我门可以用try{来捕捉}catch{来对它门进行处理}.捕捉异常,我门可以防止程序的崩溃,并给用户一些自定义但更加详细的错误信息,并提供相应的解决方案,这是我门的目的: 完整的try...catch,如下
try{
用try包住可能发生异常的代码区域, 如果这段代码发生异常,
程序就会产生一个Exception对象,并将它传给catch
}
catch(Exception e)
{
catch如果接收到一个异常对象,就会执行catch中的代码,常见的代码如下
System.out.println(e.getMessage());
getMessage()是异常对象中的一个方法,返回异常对应的错误信息.
这里的e,相当于函数的一个形参,它的名字可变,你可以将其改为ex.
}
我门还可以在一个函数定义的原形后面 加上 throws Exception,这是一个声明,声明这个函数执行时可能会发生异常.
加了这个之后可以提醒程序员,这里可能发生异常.并且它强制我门在调用这个函数的时候必须加上try..catch..,否则编译不通过.当然,你可以在调用这个函数的外面这个函数上,例如在main()函数上也加上throws Exception,那么你就可以不用加try..catch..了,当然这是不可取的.有异常发生,就应该处理,虽然可以骗过编译器,但发生问题就不好办了.
java中许许多多异常类,每个类都有自己特定的错误信息,不过他们都是Exception的子类. 我门也可以定义自己的异常类,但必须继承 Exception类.定义完后,就可以和其他异常类一样使用了. 要使用它, 需要自己在特定的时候,在try中判断是否发生异常,然后可以 通过
throw new MyException(),来扔出异常.然后由catch接收.
其实catch可以这样写:
catch(ArithmeticException e) {...} catch(MyException e) {...} catch(Exception e) {...}
这里的catch有点想switch..case..语句,它会按顺序判断抛出的异常是否和当前的异常匹配.由于可能产生多种异常,每次产生哪个异常不知道. 这里的多个catch几可以匹配特定的异常而进行特定的处理. 注意一定要把Exception放在最后.因为它可以匹配所有的异常,主要用于捕获我门未知的异常.已知的异常应该让我门自己来匹配,而不是被Exception给屏蔽掉.
在catch后面还可以加上finally{}语句,它里面的代码,不管try里面有没有发生异常,它都会执行.它和直接放在catch后面代码的区别是,
除了在try或catch中调用exit()函数提前终止了程序,否则即使前面执行了return或break,它里面的代码也会执行.但普通的代码就不会执行了.我门可以在finally里面进行一些资源清理工作,并确保的它的执行. 值得注意的是,父类的某方法如果会发生异常,并且父类中另一方法调此方法时加上了try..catch..在这种情况下.子类如果覆盖了这个会发生异常的方法,它如果要扔出异常必须和父类相同.
java中的包package:
使用包,可以将类组织起来.它可以方便组织自己的代码,并将自己的代码和别人的代码分开管理.java的包具有层次结构,使用包的原因可以确保类名的唯一性. 要想将一个类放入包中,就必须将包的名字放在源文件的开头:
package com.everpointer;
如果没在源文件中放置package语句,那么这个源文件中的类就被放置在一个默认包中.默认包是一个没有名字的包.
实际的开发中都应该创建包,不过只能写一条这样的语句哦.
指定包名后, 包名所指定的结构必须要创建相对应的实际目录结构,并将类文件拷贝其中. 不过我门可以在使用 javac 的时候加上-d参数,来指定类文件所存放的目录.可惜它不回自动生成相应的目录,这算是sun的一个疏忽把.
当对一个包中的类文件进行解释执行时,首先要将包所在目录加到classpath当中,才能被java程序找到. 并且在java 后所要解释的类,它的名字中一定要包含它所在的包名. 如 要解释执行 com.everpointer包中一个test类,那命令应该是 java com.everpointer.test. 加了包名的类才是这个类的完整的名称.否则只是写上test的话,系统会在classpath中按顺序一一查找,可能在很多目录中都有test类,这样找到的就不是我门要找的那个类了.加了包名,类名独一无二,就不会发生这样的问题了.
import:
import java.util.*;
import 可以 让我们引入另一个包中的类.一个包要想被另一个包引入访问,它必须是public的.而一个类文件只能有一个public类,并且源文件的名字必须和类名一样.这些要注意.
tips: 编译代码的时侯如果提示找不到类,则可能的原因有:
1. 可能类名写错了,如大小写错误.
2. 类在另一个包中,你没有import
3. 是 classpath的路径问题,import在classpath设置的路径中找不到相应的包名.
标准的java类库分布在多个包中,如jdk中常用的包 java.lang,我门常用的String类就在这个包中.不过象这种包,我门不需要写import语句,编译会自动引入. 还有列如ava.lang和java.lang.a包,它们之间没有任何的关系,这跟名字没有关系.
访问控制: 有一个表格可以表现出不同类之间的访问控制形式,如下:(*代表可以访问)
private default protected public
同一个类 * * * *
同一包中类 * * *
子类 * *
其他包中类 *
除了变量和函数有访问控制,类也有. 不过类只有 public 和 缺省两种.
java的命名规范: (一多个单词组成一个名字为例)
1. 包名, 单词全小写.
2. 类名和接口名,单词首字母都大写.
3. 方法和变量名, 第一个单词小写,剩余的单词首字母大写.
4. 常量名都大写.
jar文件:又称jar包,是一种压缩文件.(和winrar,winzip兼容,可用它来打开查看)
jdk中的类包,就放在jar文件中.
sun公司为我提供的 jar程序, 可方便的用来生成jar文件.下面是命令示例:
jar -cf lesson.jar org (将org包压缩成 一个 叫 lesson.jar文件.
jar -tf lesson.jar > 1.txt 查看一个jar文件的内容,后面的是重定向命令.
jar -xf lesson.jar 解压jar文件.
以后要引入jar文件包中的类的时候,只要把它当成是一个目录,设置classpath的时候路径的最后还要加上这个jar文件.我门就能找到其中的类并使用. 也就是编译器能够读取jar文件里的内容.这样的设置真的很便利,只需要把包放在一个jar文件就可以了.不需要棉队一大堆的文件夹.
不过在使用jar命令生成jar文件的时候要注意,它会根据当前所在目录,目录中的所有文件夹都会被放入jar文件中.所以一定要进入包所在的目录后,再执行jar命令,这样jar文件中的包结构才会正确.如:
要放入jar文件的org包的所在路径 D:/javawork/lesson/org
当前路径:是 D:/javawork
执行的命令是 jar -cvf lesson.jar lesson/org 表面上你的这条命令的意思把lesson目录中的org放入jar中. 但实际jar中的结构确是jar/org. jar把命令参数中的lesson也压缩了进去. 所以.一定要进入lesson这个目录,再压缩org包,才不会出错.
好了今天就先到这把.