Java问题汇总

2012/2/23

今天在命令行编译程序的时候遇到这样的一个问题:

使用了未经检查或不安全的操作,要了解详细信息,请使用 -Xlint:unchecked 重新编译。

网上查找资料后发现是以下的原因:

在编译java源文件时,你使用的是jdk1.5或以上时,可能出现这个问题。(使用了未经检查或不安全的操作;请使用 -Xlint:unchecked 重新编译。) 
原因是jdk1.5里的集合类的创建和jdk1.4里有些区别,主要是jdk1.5里增加了泛型,也就是说可以对集合里的数据进行检查。在jdk1.5以前,如果没有指定参数类型,则JDK1.5编译器由于无法检查给出的参数是否合乎要求,而报告unchecked警告,这并不影响运行。按照提示,编译时指定参数即可取消这样的警告,或者为其制定类型参数。比如: 
List temp = new ArrayList (); 
  temp.add("1"); 
  temp.add("2"); 
修改为 
List <String> temp = new ArrayList <String> (); 
  temp.add("1"); 
  temp.add("2"); 

还有一个问题是关于package的,编译以及运行的时候没有指定package的路径,导致一直提示说没有找到相应的类,这个问题当时也是让我纠结了很久啊,水啊!!!

比如代码中添加了package mypackage,那么编译的时候应该是在对应的目录下执行javac mypackage.MyClass.java。

package好比java用来组织文件的一种虚拟文件系统。package把源代码.java文件,.class文件和其他文件有条理的进行一个组织,以供java来使用。package是将文件组织在一颗类似unix,linux文件系统的树结构里面,它有一个根"/",然后从根开始有目录和文件,目录中也还有文件和目录。

2012/2/26

今天安装JPF,分别在linux和windows下做了尝试,过程比较曲折,还是记一下避免今后再犯类似的低级错误。
Linux下,安装了svn之后直接下载代码,由于JDK之前已经安装好,环境变量也配置好了,所以只要进入相应目录下执行bin/ant test就可以了,但是junit执行的时候会出现DateFormatTest.java和SimpleDateFormatTest.java执行failed,这时候需要进入这两个文件把相关的assert函数都屏蔽掉,重新执行bin/ant test就可以完成编译了。
比较折腾的是Windows下的安装,一开始出现unable to locate tools.jar,看了一下安装的说明文档发现是还没修改JAVA_HOME,于是在JAVA_HOME后面添加了D:\jdk1.6.0_20\lib\tools.jar,当然问题就从这里开始了,接下来在执行build.xml文件到了第52行的时候一直提示no javac was found,在这里纠结了很久,Linux下各个路径之间的分隔符是冒号(:),而在windows下则是分号(;),因为我在最后一个路径的后面没有再添加一个分号,按照以往的情况应该是没有问题的。但是这次运行一个批处理文件的时候需要用到JAVA_HOME继续获取其他的路径,所以在执行批处理文件的时候一直出错。仔细看了那份批处理文件后才意识到应该要在JAVA_HOME的最后一个路径后面也添加一个分号作为分隔符,这才顺利完成了JPF的编译运行。
通常,我们需要设置三个环境变量:JAVA_HOME、PATH 和 CLASSPATH。
JAVA_HOME:该环境变量的值就是 Java 所在的目录,一些 Java 版的软件和一些 Java 的工具需要用到该变量,设置 PATH 和 CLASSPATH 的时候,也可以使用该变量以方便设置。
PATH:指定一个路径列表,用于搜索可执行文件的。执行一个可执行文件时,如果该文件不能在当前路径下找到,则依次寻找 PATH 中的每一个路径,直至找到。或者找完 PATH 中的路径也不能找到,则报错。Java 的编译命令 (javac),执行命令 (java) 和一些工具命令 (javadoc, jdb 等) 都在其安装路径下的 bin 目录中。因此我们应该将该路径添加到 PATH 变量中。
CLASSPATH:也指定一个路径列表,是用于搜索 Java 编译或者运行时需要用到的类。在 CLASSPATH 列表中除了可以包含路径外,还可以包含 .jar 文件。Java 查找类时会把这个 .jar 文件当作一个目录来进行查找。通常,我们需要把 JDK 安装路径下的 jre/lib/rt.jar (Linux: jre/lib/rt.jar) 包含在 CLASSPATH 中。

2012/2/28

static数据和static方法。

通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例对象。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。可以将方法和变量都声明为static,static成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static。 
声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用一个static变量。

声明为static的方法有以下几条限制:
它们仅能调用其他的static 方法; 
它们只能访问static数据; 
它们不能以任何方式引用this 或super。

以下是代码示例:

class HelloWorld 
{ 
	int a1 = 6; 
	public static void main(String[] args) { 
	System.out.print(a1);    
	/*  成员变量不能直接调用(无法从静态上下文中引用非静态变量a1)*/ 
	} 
} 
/*编译时报如下错: 
HelloWorld.java:7: 无法从静态上下文中引用非静态变量 a1 System.out.print(a1); */ 
/*1 错误 
因为非静态的变量a1没有初始化,改为如下程序*/ 
class HelloWorld 
{ 
	int a1 = 6; 
	public static void main(String[] args) { 
		HelloWorld abc=new HelloWorld(); 
		System.out.print(abc.a1); 
	} 
} 
//编译通过。


socket 与 多线程

import java.net.*;   
import java.io.*;   
public class MultiUser extends Thread{   
	private Socket client;   
	public MultiUser(Socket c){   
		this.client=c;   
	}   
	public void run(){   
		try{   
			BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));   
			PrintWriter out=new PrintWriter(client.getOutputStream());   //Mutil User but can't parallel  
			while(true){   
				String str=in.readLine();   
				System.out.println(str);   
				out.println("has receive....");   
				out.flush();   
				if(str.equals("end"))   
					break;   
			}   
			client.close();   
		}
		catch(IOException ex){
			/*...*/
		}
		finally{
			/*...*/
		}   
	}   
	public static void main(String[] args)throws IOException{   
		ServerSocket server=new ServerSocket(5678);   
		while(true){   
			//transfer location change Single User or Multi User  
			MultiUser mu=new MultiUser(server.accept());   
			mu.start();   
		}   
	}   
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值