收集了几个易错的或好玩的Java输出题,分享给大家,以后在编程学习中稍微注意下就OK了。

1. 看不见的空格?

下面的输出会正常吗?

package basic;

public class IntegerTest {

    public static void main(String[] args) {
System.out.println(Integer.parseInt("1"));
System.out.println(Integer.parseInt("2"));
}
}

解析:将上面代码复制下(不要自己手敲)在自己的环境里运行看看,是不是输出下面错误来了:

1
Exception in thread “main” java.lang.NumberFormatException: For input string: “2”
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at basic.IntegerTest.main(IntegerTest.java:7)

竟然说第二条语句有问题,表面上完全看不出来任何问题是不是!
实际上这里的错误原因涉及到一个概念 — 零宽度空格,可能有人接触过,但相信更多的人甚至都没听过,什么是零宽度空格?它实际上是一个Unicode字符,是一个空格,关键是它没有宽度,因此我们一般肉眼看不到。但可以在vim下看到,上面的第二条语句中的2前面就有一个零宽度空格,放到vim中打开后你会发现是下面这样的语句:

System.out.println(Integer.parseInt("<feff>2"));

Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做”零宽度非换行空格“(ZEROWIDTHNO-BREAKSPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。因此下面的语句会输出65279,刚好是FEFF

System.out.println((int)"2".charAt());

2. 类静态成员初始化

下面的程序能编译通过么?如果通过,说结果并解释,不能编译,说错误原因。

class A
{
public static int X;
static { X = B.Y + ;}
}
public class B
{
public static int Y = A.X + ;
static {}
public static void main(String[] args) {
System.out.println("X = "+A.X+", Y = "+B.Y);
}
}

解析:这个程序能正确运行,类的运行过程如下:

首先加载主类B,初始化静态成员Y,发现需要类A的信息,于是加载类A,初始化静态成员X,也用到B类信息,由于此时B类的Y还未成功加载因此这里是默认值0,从而得到A类的X为1,然后返回到B类,得到Y为2。

3. 装箱拆箱的实际过程

关于自动装箱,相信大部分人都明白是怎么一回事,但真的完全明白了嘛?
先看下面的代码:

Short s1 = ;
Short s2 = s1;
System.out.println(s1 == s2);

谁都知道当然打印true了。现在加一句试试:

Short s1 = ;
Short s2 = s1;
s1++;
System.out.println(s1 == s2);

还是true吗?No,这次输出成了false。WHY?难道s1和s2引用的不是同一个对象吗?有这些疑问的说明你对自动装箱拆箱的过程还不是非常清楚,实际上上面的代码可以翻译为下面的代码(实际执行过程,要掌握):

Short s1 = new Short((short));
Short s2 = s1;
short tempS1 = s1.shortValue();
tempS1++;
s1 = new Short(tempS1);
System.out.println(s1 == s2);

哦,原来如此,这下明白了,因此我们在使用自动装箱的时候小心点为妙。

4. 你自以为是的异常

先来两句代码:

NullTest myNullTest = null;
System.out.println(myNullTest.getInt());

相信很多人看到这段代码时,都会自以为是的说:NullPointerException。果真如此吗?你还没看到NullTest 这个类是如何定义的呢。现在看看这个类的定义:

class NullTest {
public static int getInt() {
return ;
}
}

发现getInt()方法体没有任何类变量和类方法的使用,因此这里会正常输出1.
记住:类变量和类方法的使用,仅仅依赖引用的类型。即使引用为null,仍然可以调用。从良好实践的角度来看,明智的做法是使用NullTest.getInt()来代替myNullTest.getInt(),但谁不不能保证不会碰到这样的代码,因此还是小心为妙。

5. 变长参数和数组,如何变通?

变长参数特性带来了一个强大的概念,可以帮助开发者简化代码。不过变长参数的背后是什么呢?Basically,就是一个数组。

public void calc(int... myInts) {}
calc(, , );

编译器会将前面的代码翻译成类似这样:

int[] ints = {, , };
calc(ints);

不过这里有两点需要注意:
- 当心空调用语句,这相当于传递了一个null作为参数。
calc();
等价于
int[] ints = null;
calc(ints);
- 当然,下面的代码会导致编译错误,因为两条语句是等价的:
public void m1(int[] myInts) { … }
public void m1(int… myInts) { … }

参考资料

Java五道输出易错题解析(避免小错误)的更多相关文章

  1. Java五道输出易错题解析(进来挑战下)

    转自:http://blog.csdn.net/lanxuezaipiao/article/details/41985243 收集了几个易错的或好玩的Java输出题,分享给大家,以后在编程学习中稍微注 ...

  2. 【笔试题】Java 易错题精选

    笔试题 Java 易错题精选 1.写出下列程序的运行结果( )String 不变性Java 值传递 public class Test { public static void main(String ...

  3. CSS网页布局中易犯的30个小错误

    即使是CSS高手,也难免在书写CSS代码的时候出一些小错误,或者说,任何一种代码都是如此.小错误却往往造成大问题,浪费很多无辜的时间来调试和排错.查看下面这份CSS网页布局中易犯的10个小错误,努力的 ...

  4. C++笔试易错题集(持续更新)

    1.如下代码输出结果是什么? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include<stdio.h> char *myString() {     ...

  5. 杭电OJ2039——三角形(c++)(易错题:数据类型不确定)

    三角形 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  6. hibernate错题解析

    01 Hibernate错题分析   解析: 此题目考查的是对Hibernate中交叉连接的理解.HQL支持SQL风格的交叉连接查询,交叉连接适用于两个类之间没有定义任何关联时.在where字句中,通 ...

  7. JAVA程序改错 (易错题)

    JAVA程序改错 1. abstract class Name { private String name; public abstract boolean isStupidName(String n ...

  8. java考试易错题大全

    常见的Java问题 1.什么是Java虚拟机?为什么Java被称作是"平台无关的编程语言"? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Ja ...

  9. Java易错题(1)

    检查程序,是否存在问题,如果存在指出问题所在,如果不存在,说明输出结果. public class HelloB extends HelloA { public HelloB() { } { Syst ...

随机推荐

  1. 雷赛dmc2410控制卡,驱动器 光栅 加电机

    一般驱动器为9pin接口:(1:VCC 2:限位近端 3:限位远端 4:GND):电源是供给限位器的 ,5:A+ 6:A- 7:B+ 8:B- 注意驱动器的电流大小和细分设置,电流一般1A左右 电流过 ...

  2. Spring MVC过滤器-委派过滤器代理(DelegatingFilterProxy)

    org.springframework.web.filter中有一个特殊的类——DelegatingFilterProxy,该类其实并不能说是一个过滤器,它的原型是FilterToBeanProxy, ...

  3. 解析:使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象

    之前开发时遇到的一个问题,使用easyui的form提交表单,在Chrome下时没问题的,但是在IE下出现类似附件下载时提示是否保存的现象. 这里记录一下如何解决的.其实这个现象不光是easyui的f ...

  4. UpdateSourceTrigger Property in WPF Binding

    介绍 这篇文章我将介绍在WPF和Silverlight中更新绑定源的概念.正如您所知道的,当我们用TwoWay的模式绑定时,任何在目标控件上发生的变化都会影响绑定源的值. 请注意只是在用TwoWay绑 ...

  5. OpenGLES入门笔记三

    在入门笔记一中比较详细的介绍了顶点着色器和片面着色器. 在入门笔记二中讲解了简单的创建OpenGL场景流程的实现,但是如果在场景中渲染任何一种几何图形,还是需要入门笔记一中的知识:Vertex Sha ...

  6. 先贴上代码:Random快排,快排的非递归实现

    设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为主元,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序.值得注意的是, ...

  7. 20145212 《Java程序设计》第7周学习总结

    20145212 <Java程序设计>第7周学习总结 教材学习内容总结 时间的度量 格林威治时间(GMT):通过观察太阳而得,因为地球公转轨道为椭圆形且速度不一,本身自传减速而造成误差. ...

  8. Java数据结构——有序链表

    //================================================= // File Name : SortedList_demo //--------------- ...

  9. RandomAccessFile类

    File类只是针对文件本身进行操作,而如果要对文件内容进行操作,则可以使用RandomAccessFile类,此类属于随机读取类,可以随机地读取一个文件中指定位置的数据. //============ ...

  10. JavaScript学习笔记——DOM_document对象

    javascript-document对象详解 DOM document(html xml) object modledocument对象(DOM核心对象) 作用: 1.内容 innerHTML 2. ...