java小问题集合

发表于:2007-07-04来源:作者:点击数: 标签:
1. 问:怎样用 Windows 的记事本 (Notepad) 来编辑 Java源程序? HM,-l 达内科技论坛 -- 达内科技论坛 * 答:记得存档时扩展名要加上". java ",文件类型改成:“所有的文件(*.*)”。 ]o*1US 达内科技论坛 -- 达内科技论坛 4 达内科技论坛 -- 达内科技论坛 B
1. 问:怎样用 Windows 的记事本 (Notepad) 来编辑 Java源程序? HM,<-l
©达内科技论坛 -- 达内科技论坛  *
答:记得存档时扩展名要加上".java",文件类型改成:“所有的文件(*.*)”。 ]o*1US
©达内科技论坛 -- 达内科技论坛  4
©达内科技论坛 -- 达内科技论坛  BwMrw7
©达内科技论坛 -- 达内科技论坛  fz)Zp>
2. 问:到底 Java 是如何传递参数的?是by value或by reference? rNZ
©达内科技论坛 -- 达内科技论坛  LE
答:All parameters (values of primitive types, and values that are references to objects) are passed by value [JLS sect 8.4.1]。根据以上 Java规格文件的说法, 所有参数应该都是传值的(by value)。但实际上, 实际经验却告诉我们所有 Java 的对象都是传址的(by reference)。因此我们可以这样解释: 基本类型(如int, float, char等)是by value,而所谓“对象”(Object)则是by value of reference to object。 |Yy
©达内科技论坛 -- 达内科技论坛  xs*
©达内科技论坛 -- 达内科技论坛  >2
©达内科技论坛 -- 达内科技论坛  y
3. 问:String这个类型的class为何定义成final? $-~\
©达内科技论坛 -- 达内科技论坛  HFnLC
答: 主要是为了“效率” 和 “安全性” 的缘故。若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。 RDx"|
©达内科技论坛 -- 达内科技论坛  ULx%
©达内科技论坛 -- 达内科技论坛  +~t
©达内科技论坛 -- 达内科技论坛  )%1{9
4. 问:finalizers和C++ 的 destructors有何差异? zKxR
©达内科技论坛 -- 达内科技论坛  /
答:Java内部具有“内存使用回收” 的机制, 虽然它也提供了类似 (C++ 的) destructors的 finalize(),每个对象都可以使用这个方法 method,但必须冒著破坏原先回收机制的危险。所以建议尽量避免使用finalize(),不妨考虑多使用 null 及 dispose() 来释出资源会好一些。 <e
©达内科技论坛 -- 达内科技论坛  Q\{"v
©达内科技论坛 -- 达内科技论坛  iTW`Sp
©达内科技论坛 -- 达内科技论坛  nsRXJ
5. 问:继承了一个class叫做 Frotz,编译器却给我“No constuctor Frotz() in the class”这样的错误提示,为什么呢? a1VK1p
©达内科技论坛 -- 达内科技论坛  tv'TSo
答:记住每当您定义了一个 class的constructor,除非您一开始就去call 这个constructor,否则 Java 会自动引入superclass原先不含参数的 constructor, 如果superclass的 constructor都是有参数的,那么问题中的错误提示便出现了。 解决的方法很简单, 找一找 API文件,加上正确的参数就得了。 `!
©达内科技论坛 -- 达内科技论坛  Jm?sR
©达内科技论坛 -- 达内科技论坛  cAB
©达内科技论坛 -- 达内科技论坛  J%]2H-
6. 问:怎样让char类型的东西转换成int类型? 6j
©达内科技论坛 -- 达内科技论坛  }(:Ei^
答: ©达内科技论坛 -- 达内科技论坛  bl-A$N
©达内科技论坛 -- 达内科技论坛  D@.
char c = 'A'; W+{~*
©达内科技论坛 -- 达内科技论坛  8
int i = c; >!X:
©达内科技论坛 -- 达内科技论坛  n
//反过来只要作强制类型转换就行了 5J**c
©达内科技论坛 -- 达内科技论坛  fF"4BT
c = (char) I; }#
©达内科技论坛 -- 达内科技论坛  7\%
©达内科技论坛 -- 达内科技论坛  R
©达内科技论坛 -- 达内科技论坛  OW
7. 问:我的applet原先好好的, 一放到web server就会有问题,为什么? Nj
©达内科技论坛 -- 达内科技论坛  L
答:一般来说,从以下方向试试: vg
©达内科技论坛 -- 达内科技论坛  "CKo7
确定class文件的格式没错——已经编译过,也没有损坏的情形; 4s4(
©达内科技论坛 -- 达内科技论坛  B*?PI
确定所有用到的class文件放到web server上,少一个都不行; pp52g
©达内科技论坛 -- 达内科技论坛  d9b5V.
确定所有的文件名和class名称一致,特别检查大小写有无差错; bt'7p
©达内科技论坛 -- 达内科技论坛  i?
如果程序中用到package,web server上的目录就要当心了。譬如您在class中宣告了一个叫COM.foo.util的package,那么web server的applet codebase目录底下就非得有 COM/foo/util这个子目录不可。(注意目录名称也有大小写之分); iFC#
©达内科技论坛 -- 达内科技论坛  Yqc
web server上的文件档案应该事先设定好。(尤其是search,read和execute权限) ${2h/
©达内科技论坛 -- 达内科技论坛  j_F
©达内科技论坛 -- 达内科技论坛  ,Fk-L
©达内科技论坛 -- 达内科技论坛  '
8. 问:怎样在 Applet中用某个图形涂满整个背景? {!.'
©达内科技论坛 -- 达内科技论坛  =3
答:在背景建立 Panel 或 Canvas, 然後用图形填满它。 g
©达内科技论坛 -- 达内科技论坛  8U
©达内科技论坛 -- 达内科技论坛  !A[
©达内科技论坛 -- 达内科技论坛  n:;h
9. 问:怎样在 Applet 中建立自己的菜单(MenuBar/Menu)? "sZl
©达内科技论坛 -- 达内科技论坛  .*Mt#
答:首先在Applet的init() 方法中建立Frame instance, 然后将Menus, Menubar都加上去即可。 (setMenuBar() 是 Frame下的方法)或者,找到Applet上层的Frame后依法炮制。 L
©达内科技论坛 -- 达内科技论坛  Bg[M,%
Container parent = getParent(); f^M^
©达内科技论坛 -- 达内科技论坛  t91UY
while (! (parent instanceof Frame) ) .bT-
©达内科技论坛 -- 达内科技论坛  q,mh
parent = parent.getParent(); ~Go]
©达内科技论坛 -- 达内科技论坛  DMkhP^
Frame theFrame = (Frame) parent; JWPS
©达内科技论坛 -- 达内科技论坛  W|jE!C
注意:第二个方法在Mac或某些browsers上并不可行。 mm
©达内科技论坛 -- 达内科技论坛  cz+
如果您使用的是JDK 1.1,也可以考虑使用popup menu,这样就不必理会Frame的问题了。 _EG
©达内科技论坛 -- 达内科技论坛  &yjq
©达内科技论坛 -- 达内科技论坛  <qM
©达内科技论坛 -- 达内科技论坛  =6
10. 怎样比较两个类型为String的字符串? 07o?Q
©达内科技论坛 -- 达内科技论坛  &
答:在两个对象之间使用 "==",会将“两个对象是否有同一reference”的结果传回。也就是说, 这等同于“两个对象是否拥有同一地址 (address)”,或者“两个对象物件是否为同一对象”。如果您的意思是判断两个字符串的内容是否相同,那么应该使用以下的方法才对: |H9
©达内科技论坛 -- 达内科技论坛  k
if (s1.equals(s2) ) 9
©达内科技论坛 -- 达内科技论坛  $
or if (s1.equalsIgnoreCase(s2) ) O7w
©达内科技论坛 -- 达内科技论坛  Sa!iXY
or if (s1.startsWith(s2) ) 1[^/
©达内科技论坛 -- 达内科技论坛  iF
or if (s1.endsWith(s2) ) |kXnD
©达内科技论坛 -- 达内科技论坛  |W`Kvt
or if (s1.regionMatches(s1_offset, s2, s2_offset, length) ) J]2
©达内科技论坛 -- 达内科技论坛  x
or if (s1.compareTo(s2) <0) Lxa
©达内科技论坛 -- 达内科技论坛  r;8
©达内科技论坛 -- 达内科技论坛  _[9o}L
©达内科技论坛 -- 达内科技论坛  (K
11. 怎样将浮点数(float)相加 ? Float 好像没有办法? uQUhL
©达内科技论坛 -- 达内科技论坛  d
答:我猜想您的程式大概写成这样: \
©达内科技论坛 -- 达内科技论坛  mve B2
Float One; x
©达内科技论坛 -- 达内科技论坛  "0gY~3
Float Two; U,
©达内科技论坛 -- 达内科技论坛  LEB*pN
Float Hard = One + Two; [m
©达内科技论坛 -- 达内科技论坛  [N1}39
请注意 float 和 Float 是不同的,前者是 Java 基本类型之一, 而后者却是class。您应该将源代码改为: ([%K
©达内科技论坛 -- 达内科技论坛  |zS
float One; EP|Da
©达内科技论坛 -- 达内科技论坛  fvQ\ D
float Two; ho
©达内科技论坛 -- 达内科技论坛  !I9
float Hard = One + Two; aE
©达内科技论坛 -- 达内科技论坛  o
©达内科技论坛 -- 达内科技论坛  Iy_od9
©达内科技论坛 -- 达内科技论坛  Y.P
Float One = new Float(1.0); !z;&
©达内科技论坛 -- 达内科技论坛  X~
Float Two = new Float(2.0); +89C
©达内科技论坛 -- 达内科技论坛  z!1=OD
Float Hard = new Float(One.floatvalue() + Two.floatvalue()); TH?,
©达内科技论坛 -- 达内科技论坛  *6*
©达内科技论坛 -- 达内科技论坛  +
©达内科技论坛 -- 达内科技论坛  W
12. 如何将字串String转换成整数int? &
©达内科技论坛 -- 达内科技论坛  cH(a_6
答:有两个方法: \
©达内科技论坛 -- 达内科技论坛  @T
1)int i = Integer.parseInt([String]); 或 "1
©达内科技论坛 -- 达内科技论坛  &}M
©达内科技论坛 -- 达内科技论坛  K
©达内科技论坛 -- 达内科技论坛  v;0h
i = Integer.parseInt([String],[int radix]); Hx$:}
©达内科技论坛 -- 达内科技论坛  N7;rS
2)int i = Integer.valueOf(my_str).intvalue(); Ms
©达内科技论坛 -- 达内科技论坛  HiE$
注: 字串转成Double, Float, Long的方法大同小异。 m$\E
©达内科技论坛 -- 达内科技论坛  %q@|6
©达内科技论坛 -- 达内科技论坛  S+
©达内科技论坛 -- 达内科技论坛  z
13. 如何将整数 int 转换成字串 String? u[jlB
©达内科技论坛 -- 达内科技论坛  Br
答:有三种方法: ?T^/
©达内科技论坛 -- 达内科技论坛  ox
1)String s = String.valueOf(i); [m`
©达内科技论坛 -- 达内科技论坛  jK)D
2)String s = Integer.toString(i); /e<YS$
©达内科技论坛 -- 达内科技论坛  BlgR
3)String s = "" + i; V%y
©达内科技论坛 -- 达内科技论坛  27@&<
注:Double, Float, Long 转成字串的方法大同小异。 wSY?\
©达内科技论坛 -- 达内科技论坛  t_
©达内科技论坛 -- 达内科技论坛  9w
©达内科技论坛 -- 达内科技论坛  &AA
14. 如何从一个文件档案的尾端新增记录? :IQJ#q
©达内科技论坛 -- 达内科技论坛  rL7='w
答:有两种方法: Xx6
©达内科技论坛 -- 达内科技论坛  r ?g#d
1)RandomAclearcase/" target="_blank" >ccessFile fd = new RandomAccessFile(file,"rw"); U
©达内科技论坛 -- 达内科技论坛  4V.2{
fd.seek(fd.length()); a`r0#
©达内科技论坛 -- 达内科技论坛  SiI
然后使用 fd 的method写入 `W;
©达内科技论坛 -- 达内科技论坛  4
2)使用FileOutputStream(String name,boolean append) throws IOException这个 constructor 7!
©达内科技论坛 -- 达内科技论坛  l$$BUO
©达内科技论坛 -- 达内科技论坛  ~e/C
©达内科技论坛 -- 达内科技论坛  Am^7
15. 如何设置Java 2(JDK1.2)的环境变量? 2J
©达内科技论坛 -- 达内科技论坛  7 5 'm
答:Java 2安装后,需要设置PATH和JAVA_HOME环境变量。与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径。Java 2环境变量的设置如下例所示: <Y/Af
©达内科技论坛 -- 达内科技论坛  ?ZbL
Solaris平台: setenv JAVA_HOME Java2的安装路径 K
setenv PATH $JAVA_HOME/bin:${PATH} b[27
©达内科技论坛 -- 达内科技论坛  7
Windows平台:set JAVA_HOME=Java2的安装路径 W
set PATH=$JAVA_HOME\bin;%PATH% #-Y&&
©达内科技论坛 -- 达内科技论坛  vlLY
©达内科技论坛 -- 达内科技论坛  3n\-K
©达内科技论坛 -- 达内科技论坛  Swok
16. 哪些Java集成开发工具支持Java 2? IY7b
©达内科技论坛 -- 达内科技论坛  w'6
答:目前流行的Java集成开发环境,如Inprise的Jbuilder;Symantec的Visual Cafe,;Sybase的PowerJ都支持Java 2。 Ub=v
©达内科技论坛 -- 达内科技论坛  W3&JL
©达内科技论坛 -- 达内科技论坛  Up
©达内科技论坛 -- 达内科技论坛  /P
17. 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围? s)
©达内科技论坛 -- 达内科技论坛  ^.3
答:当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM。而不同浏览器对JDK的支持程度也不尽相同。因此,在Netscape或IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该applet,以确定错误的产生是与浏览器相关。如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览器不完全兼容JDK而引起的。此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin。如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误提示检查applet程序。 tzA{@0
©达内科技论坛 -- 达内科技论坛  Zp?m
©达内科技论坛 -- 达内科技论坛  66;7
©达内科技论坛 -- 达内科技论坛  D7F`+r
18. 在Java语言中,如何列出PC机文件系统中的所有驱动器名? 4G
©达内科技论坛 -- 达内科技论坛  4=0BJ
答:在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能。 |e@12N
©达内科技论坛 -- 达内科技论坛  Q
©达内科技论坛 -- 达内科技论坛  ^jB
©达内科技论坛 -- 达内科技论坛  [:w&
19. 为什么Runtime.exec("ls")没有任何输出? O;
©达内科技论坛 -- 达内科技论坛  A
答:调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息。由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(),Process.getErrorStream()方法重定向给它的父进程了。用户需要用这些stream来向子进程输入数据或获取子进程的输出。所以正确执行Runtime.exec("ls")的例程如下: %g"fXd
©达内科技论坛 -- 达内科技论坛  2nkXR
try ©达内科技论坛 -- 达内科技论坛  XnYGF
©达内科技论坛 -- 达内科技论坛  =
{ ©达内科技论坛 -- 达内科技论坛  `
©达内科技论坛 -- 达内科技论坛  !8_tZ
process = Runtime.getRuntime().exec (command); Gsh\
©达内科技论坛 -- 达内科技论坛  c"cJK
InputStreamReader ir=newInputStreamReader(process.getInputStream()); u4q'
©达内科技论坛 -- 达内科技论坛  W3Q<
LineNumberReader input = new LineNumberReader (ir); 3H`i
©达内科技论坛 -- 达内科技论坛  =QYD
String line; (
©达内科技论坛 -- 达内科技论坛  AP
while ((line = input.readLine ()) != null) Ob[7k
©达内科技论坛 -- 达内科技论坛  {.:V
System.out.println(line); #
©达内科技论坛 -- 达内科技论坛  pG
} ©达内科技论坛 -- 达内科技论坛  zbz&Z,
©达内科技论坛 -- 达内科技论坛  2
catch (java.io.IOException e){ mYKL
©达内科技论坛 -- 达内科技论坛  [kG
System.err.println ("IOException " + e.getMessage()); Y
©达内科技论坛 -- 达内科技论坛  {n
} ©达内科技论坛 -- 达内科技论坛  T@{|C
©达内科技论坛 -- 达内科技论坛  `
©达内科技论坛 -- 达内科技论坛  Y5-6Jm
©达内科技论坛 -- 达内科技论坛  ?eUK]
20. 若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException? g'bP0|
©达内科技论坛 -- 达内科技论坛  ({;X
答:使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应。ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头。因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头。所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException。 !G"T%5
©达内科技论坛 -- 达内科技论坛  &.=
一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法。被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object?若是,则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法。 G
©达内科技论坛 -- 达内科技论坛  M{Jpi
©达内科技论坛 -- 达内科技论坛  '
©达内科技论坛 -- 达内科技论坛  I@7f
21. 对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中? c\Vzi
©达内科技论坛 -- 达内科技论坛  4J
答: 目前,没有直接的方法可以将对象写入到随机存取文件中。但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象。需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误。例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中。相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象。 s8dcYp
©达内科技论坛 -- 达内科技论坛  '!
©达内科技论坛 -- 达内科技论坛  -~Vz
©达内科技论坛 -- 达内科技论坛  7y,
22. 在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之? /A@.](
©达内科技论坛 -- 达内科技论坛  Er
答: Thread.suspend本身易于产生死锁。如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源。如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁。 +hW%t
©达内科技论坛 -- 达内科技论坛  Q`n
因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态。一旦需要该线程继续运行,其它线程会调用notify()方法来通知它。 a
©达内科技论坛 -- 达内科技论坛  )M
©达内科技论坛 -- 达内科技论坛  d%

    }

原文转自:http://www.ltesting.net