今天在用java命令加截 DBConn类文件时,老是提示exception in main classNOfound,并提示一个wrong name 错误,后来才发现,原来是java命令找不到指定的类文件,为什么呢?当我运行java DBConn命令是,java会认为我是提出了在类路径中加截一个全名为DBConn的class文件.就会在类路径中进行查找,而类路径中包含了"."当前目录,那么就会在当前目录中找全名为DBConn的class文件,而在当前目录中确实又存在了DBConn.class,但java却说找不到,并且提示说名字错误,并且给出他的全名。原因是java在查找时是按类的全名来查找的,当我在运行java DBConn时,java会认为这是一全名为DBConn的类文件,所以就会在当前目录中找该类文件,并且找到了,然后尝试加载他,当加载的时候出现问题了,java发现了所加载的DBConn的全名应该是com.sandy.src.DBConn,而并不是DBConn.然后就报错说找不到类并提示出该类的全名。也就是说我在运行java命令时,所指定的名字应该一个正确完整的类全名,对于DBConn类文件来说,DBConn只是类名,并不是全名。
所以我应该运行java com.sandy.src.DBConn来加截DBConn类文件,后来我确实又试了,但还是说exception in main classnotfound,但并不提示类全名.虽然我指定了类的全名,但是在当前目录还找不到该全名的类文件,并且这一次不是因为名字不对而提示找不到,而是直接说找不到,为什么呢?那只能说明了在类路径的当前目录中并不存在该类文件,虽然我在当前目录有一个拥有全名为com.sandy.src.DBCOnn的DBConn类文件,但他的全名只有在加载后才判定的,而在查找时只认为该文件的全名就是DBConn,并在加载后才判定所加载的类文件的是否指定的全名文件.所以当我指定全名为com.sandy.src.DBConn时,java就不会去加载DBConn,因为java认为他不是要找的文件,而去找com.sandy.src.DBConn。那这样的全名要怎么找呢,这就涉及了java的命名机制,java的全名机制是用包名来包装的,而包名又映射到具体的目录路径当中去,所以对于全名为com.sandy.src.DBConn类,映射到目录中应该为com目录\sandy目录\src目录\DBConn.class.换句说,同样的全名路径类文件对应了同样的全名文件,所以当java要去找全名为com.sandy.src.DBConn的类文件时,就会在当前目录当中找对应着这样全名的全名路径类文件:com目录\sandy目录\src目录\DBConn.class的文件,也就是说,只要我们在当前目录建立了这样的一个全名路径,并把对应的类文件放到全名路径下,这就构成了全名路径类文件,并对应于指定的全名文件.这样,当用java命令加载时就可以找得到并成功加载.后来我就在当前目录中建立com目录\sandy目录\src目录,并把DBConn.class文件剪切到src目录下,再加载,就成功了。总的来说就是:在用java命令加载类文件时,必须要能在类路径中找到该类的全名(对于有打包的类,那么该类的全名是包名+类名,包的全名是以目录的方式组织的),也就是说要在classpath那里指定了类路径,并且在类路径的根目录中存在以包目录方式组织好的类文件。这些纯粹是个人的理解,并没有办法进行考证,还望高手们指出有什么不对的地方。谢了