Java中容易出错的一些问题

作者在 2008-04-01 13:59:17 发布以下内容
1. String类的toString()方法
        刚开始一直没注意过这个问题,后来才发现,String类有这个toString方法的,其作用是返回这个string本身。

public class A {

public static void main(String args[]) {

if("a".toString() == "a") {

System.out.println("a");

} else {

System.out.println("b");

}

}

}
        这个程序中,输出结果是a,并不会因为string对象调用toString方法而报错。
2. 数组的定义

public class A {

public static void main(String args[]) {

int[][] a = new int[2][];

int[] b = new int[]{1, 2};

}

}
        定义一个二维数组,如int[][] a, 可以在new int[2][]中只写第一个维数,也可以写成new int[2][2]两个都写,但是不能都为空。
        定义数组b的时候,{}中的初始化内容可以跟在new int[]后面,但是要注意,这个时候[]中不能添加数字了。
3. 继承时候构造方法的影响

public class A extends Super {

public A(String str) {

i = 2;

}

public static void main(String args[]) {

A a = new A("Hello");

System.out.println(a.i);

}

}

class Super {

int i;

public Super(String str) {

i = 1;

}

}

        大家看这段程序输出什么结果?2?错了。1?也错了。答案是:无法通过编译。因为Super类中并没有提供无参的构造方法,当A继承Super类时,找不到Super的无参构造方法,所以无法通过编译,即使你为A类写了一个无参构造方法也不行。必须要提供一个Super的无参构造方法,这样才可以通过运行。
4. 迭代器的问题

import java.util.*;

public class A {

public static void main(String args[]) {

List list = new ArrayList();

list.add("Cat");

list.add("Dog");

list.add("Rat");

ListIterator ltr = list.listIterator();

int i = 1;

while (ltr.hasNext()) {

if (i == 2)

System.out.println(ltr.previous());

else

i++;

}

}

}
        答案是NoSuchElementException。也许有人会奇怪,第一次循环中,虽然判断了i == 2不成立,转而执行else中的i++,接着第二轮循环开始的时候,i==2成立了,为什么不打印出前面一个元素即Dog呢?因为,hasNext()方法虽然判断了是否有下一个元素,但是,迭代器并没有向后移动,此时还停留在第一个元素即Cat前面的,所以会出现异常。只有next()或previous()才会移动迭代器。

5. 公共类与类文件
以下这段代码是放在名称为Test.java的文件中的

class Base{

public static void main(String[] args){

System.out.println("Hello");

}

}

 

public class Test{}

        运行结果是什么?NoSuchMethodError。但是如果Test是extends Base的话,那就能够正常输出Hello。

6. 重载方法与null

public class A {

public void method(Object o) {

System.out.println("Object Version");

}

public void method(String s) {

System.out.println("String Version");

}

public static void main(String args[]) {

A question = new A();

question.method(null);

}

}
        method方法被重载了。一个参数是Object,一个参数是String。运行的时候我们把null传进去,得到的结果是String Version,说明调用的是参数为String的method方法。
7. 抽象类的定义
        抽象类中可以包含抽象方法,也可以不包含抽象方法。但是只要有一个抽象方法,这个类就必须声明为abstract!
8. 变量初始化问题

public class A {

static boolean b1;

public static void main(String args[]) {

boolean[] b2 = new boolean[1];

boolean b3;

System.out.println(b1);

System.out.println(b2[0]);

System.out.println(b3);

}

}
        以前说过,一个类的变量有默认值,但是在方法中定义的变量必须要初始化才能用,不然会报错。这个程序中,b3是方法中定义的变量,这样用是错误的,因为没有初始化。但是,b2这个数组却是可以的,b2[0]的值是false。虽然没有初始化,但是像这样在方法中声明的数组却可以拥有默认值。

9. String的concat方法

public class A {

public static void main(String args[]) {

String a = null;

a.concat("abc");

a.concat("def");

System.out.println(a);

}

}
        编译不会报错。答案是abcdef,吗?不是,会出现空指针异常。因为刚开始a总是指向null的。

10.多余的异常

public class A {

public static void main(String args[]) {

A a = new A();

try{

a.bad();

}catch(Ex1 e) {

}catch(Ex2 e){

}

}

void bad() throws Ex1{

}

}

class Ex1 extends Exception{}

class Ex2 extends Exception{}

         这个程序有两个自定义异常Ex1和Ex2,同时,A类有一个bad()方法抛出Ex1异常。在main方法中,调用bad方法,然后catch Ex1、Ex2。这个程序是会出现编译错误的。因为在catch Ex2那里会说Ex2永远不会抛出,这就是多余的异常。

Java | 阅读 2446 次
文章评论,共0条
游客请输入验证码