Java中容易出错的一些问题[总结]

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[]...{12};

}


}


        定义一个二维数组,如int[][] a, 可以在new int[2][]中只写第一个维数,也可以写成new int[2][2]两个都写,但是不能都为空。
        定义数组b的时候,{}中的初始化内容可以跟在new int[]后面,但是要注意,这个时候[]中不能添加数字了。
3. 继承时候构造方法的影响
        大家看这段程序输出什么结果?2?错了。1?也错了。答案是:无法通过编译。因为Super类中并没有提供无参的构造方法,当A继承Super类时,找不到Super的无参构造方法,所以无法通过编译,即使你为A类写了一个无参构造方法也不行。必须要提供一个Super的无参构造方法,这样才可以通过运行。
4. 迭代器的问题
java.util.*;

public

 

List list =

list.add(

list.add(

list.add(

ListIterator ltr = list.listIterator();

 

 

 

System.

 

class A {public static void main(String args[]) {new ArrayList();"Cat");"Dog");"Rat");int i = 1;while (ltr.hasNext()) {if (i == 2)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
class A {public void method(Object o) {out.println("Object Version");public void method(String s) {out.println("String Version");public static void main(String args[]) {new A();null);

public

 

System.

}

 

 

System.

}

 

 

A question =

question.method(

}

}
        method方法被重载了。一个参数是Object,一个参数是String。运行的时候我们把null传进去,得到的结果是String Version,说明调用的是参数为String的method方法。
7. 抽象类的定义
        抽象类中可以包含抽象方法,也可以不包含抽象方法。但是只要有一个抽象方法,这个类就必须声明为abstract!
8. 变量初始化问题
class A {static boolean b1;public static void main(String args[]) {boolean[] b2 = new boolean[1];boolean b3;out.println(b1);out.println(b2[0]);

System.

out.println(b3);

}

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

9. String的concat方法
class A {public static void main(String args[]) {null;"abc");"def");out.println(a);

public

 

String a =

a.concat(

a.concat(

System.

}

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

10.多余的异常
class A {public static void main(String args[]) {new A();try{catch(Ex1 e) {catch(Ex2 e){void bad() throws Ex1{

class

Ex1 extends Exception{}

class

 

11.输出的问题

 

public class Plus 
...{
     
public static void main(String[] args) 
     
...{
          
int c=1;
          
int a;
          c
=c++;
          a
=c;
          System.out.println(
"c = "+c+" a="+a);
     }

}

 

 

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

public

 

A a =

 

a.bad();

}

 

}

 

}

}

 

 

 

}

}

 

public

 

 

 

 

System.

System.

public

 

 

}

 

A a =

System.

}

}

 

class A extends Super {public A(String str) {i = 2;public static void main(String args[]) {new A("Hello");out.println(a.i);

class

 

 

 

}

}

 

import

 

Super {int i;public Super(String str) {i = 1;

你可能感兴趣的:(Java中容易出错的一些问题[总结])