Java语言程序设计(原书第8版)--基础篇 警告(二)

掌握Java语言基本且必备的知识点,在实践中运用并总结!

21.不要在块内声明一个变量然后企图在块外使用它。下面是一个常见错误的例子:
for(int i = 0; i < 10; i++) {
}
System.out.println(i);
因为变量i没有在for循环外定义,所以最后一条语句就会产生一个语法错误。
22.一些语言使用圆括号引用数组元素,例如myList(9)。而Java语言使用方括号,例如myList[9]。
23.数组初始化语法中不使用运算符new。使用数组初始化语法时,必须将声明、创建和初始化数组都放在一条语句中。将它们分开会产生语法错误。因此,下面的语句是错误的:
double[ ] myList;
myList = {1.9, 2.9, 3.4, 3.5};
24. 使用matrix[2, 1]访问第2行第1列的元素是一种常见错误。在Java中,每个下标必须放在一对括号中。
25.回想一下,我们曾经使用过Math.methodName(参数)(例如:Math.pow(3, 2.5))来调用Math类中的方法。那么能否用Circle.getArea方法呢?答案是不能。Math类中的所有方法都是用关键字static定义的静态方法。但是,getArea()是实例方法,因此它是非静态的。它必须使用objectRefVar.methodName(参数)的方式(例如:myCircle.getArea())从对象调用。更详细的解释将在8.7节中给出。
26.NullPointerException是一种常见的运行错误,当调用值为努力来的引用变量上的方法时会发生此类异常。在通过引用变量调用一个方法之前,确保先将对象引用赋值给这个变量。
27.一个常见的设计错误就是将一个本应该声明为静态的方法声明为实例方法。例如:方法factorial(int n)应该定义为静态的,如下所示,因为它不依赖于任何具体的实例。
28.修饰符private只能应用在类的成员上。修饰符public可以应用在类或类的成员上。在局部变量上使用修饰符public和private都会导致编译错误。
29.如果使用像> 、>=、<或<=这样的比较运算符比较两个字符串,就会发生语法错误。替代的方法就是使用s1.compareTo(s2)来进行比较。
30.length是string类的一个方法,但它是数组对象的一个属性。所以。要获取字符串s中的字符个数,必须使用s.length(),而要获取数组a中的元素个数,就必须使用a.length。
31.在字符串s中越界访问字符是一种常见的程序错误。为了避免此类错误,要确保使用的下标不会超过s.length() -1。例如,s.charAt(s.length())会造成一个StringIndexOutOfBoundsException异常。
32.在Windows中目录的分隔符是反斜杠(\)。但是在Java中,反斜杠是一个特殊的字符,应该写成\\的形式(参见表2-6)。
33.要调用父类构造方法必须使用关键字super,而且这个调用必须是构造方法的第一条语句。在子类中调用父类构造方法的名字会引起一个语法错误。
34.如果一个类要设计为扩展的,最好提供一个无参构造方法以避免程序设计错误。考虑下面的代码:
public class Apple extends Fruit {
}
class Fruit {
    public Fruit(String name){
        System.out.println(“Fruit’s constructor is invoked");
    }
}
由于在Apple中没有显式定义的构造方法,因此,Apple的默认无参构造方法被隐式调用。因为Apple是Fruit的子类,所以Apple的默认构造方法会自动调用Fruit的无参构造方法。然而,Fruit没有无参构造方法,因为Fruit显式地定义了构造方法。因此,程序不能被编译。
35.对象成员访问运算符(.)优先于类型转换运算符。使用圆括号保证在点运算符(.)之前进行转换。例如:
((Circle)object.getArea());
36.在子类中,使用签名equals(SomeClassName obj)(例如:equals(Circle c))覆盖equals方法是一个常见错误。应该使用equals(Object obj)。参见父子题11.15。
37.在设计布局风格时,不要忘记在布局管理器类之前使用new操作符。例如,setLayout(new FlowLayout())。
38.目前,java还没有抛出整数上溢或下溢异常。下面的语句给最大整数加1。
int number = Integer.MAX_VALUE + 1;
System.out.println(number);
它会显示-247483648,这在逻辑上是错误的。引起该问题的原因是上溢;也就是说,结果超出了int型值的最大范围。
39.如果House没有覆盖clone()方法,程序就会收到一个语法错误,因为在java.lang.Object中clone()是被保护的。如果House不实现java.lang.Cloneable,调用House.java中的super.clone()会导致一个CloneNotSupportedException异常。这样,为了克隆一个对象,改对象的类必须覆盖clone()方法并实现Cloneable。
40.尽管int型的值可以赋给double型变量,但是int[]和double[]是两个不兼容的类型。所以,不能把一个int[]数组赋值给double[]型变量或Object[]型变量。
41.永远都不要直接调用paintComponent方法。它应该在视图区域改变时由JVM调用或者由repaint方法调用。应该覆盖paintComponent方法告诉系统如何绘制视图区域,但永远都不要覆盖repaint方法。
42.MessagePanel类使用属性xCoordinate和yCoordinate指定消息在面板上显示的位置。不要使用属性名x和y,因为它们已经在Component类中定义,使用方法getX()和getY()返回上一级坐标系中组件的位置。
43.Applet类的getParameter方法只能在创建一个applet的实例之后调用。因此,这个方法不能在applet类的构造方法中调用。应该从init方法中调用它。
44.应该按存储的顺序和格式读取文件中的数据。例如,学生的姓名是用writeUTF方法以UTF-8格式写入的,所以,读取时必须使用readeUTF方法。
45.如果递归不能是问题简化并最终收敛到基础情况,就有可能出现无限递归。例如,假设将factorial方法错误地写成如下所示:
public static long factorial(int n) {
    return n * factorial(n - 1);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值