Java学习之路(五)--Thinking in Java

  写程序要细心,遇到bug要善于排查。

  今天在用Java写几个小程序的时候,由于极力追求优化与功效,忽视了一个小小的细节问题。但最终找到了bug并且解决了它。

  我们都知道,在使用for循环的时候,比如:

for(int i = 0; i < n; i++){...}

  我们一般都这儿写。但是仅仅这样是不够的,因为这段语句还可以进行优化。比如i<n,就不如直接判断i!=n,这样在计算机内部可以节省运算时间。还有,i++还可以改写成++i,因为i++需要计算机保存i之前的值之后再+1,++i直接让i+1并没有临时变量。可是,正因为如此,一个小小的不易察觉的bug发生了。

  原题目很简单,就是求整数a,b之间的全部素数。开始我是这么写的:

import java.io.*;
import java.util.*;
public class number2 {
	public static void main(String[] args) throws IOException{
		int begin, end;
		String str;
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		str = br.readLine();
		begin = new Integer(str);
		BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
		str = br1.readLine();
		end = new Integer(str);
		for (; begin != end; ++begin){
			boolean b = true;
			for(int i = 2; i != Math.sqrt(begin); ++i){
				if(0 == begin % i){
					b = false;
					break;
				}
			}
			if(b)
				System.out.println(begin);
		}
	}
}

注意仔细看代码着色部分,乍看之下没什么不对,追求了性能。可是运算的结果却是令人大吃一惊。求101到200的素数,出现121,169两个数。经过我仔细排查之后发现原来bug正是出在这里:Math.sqrt()是double,i是一个int,在与double的比较过程中是永远不相等的。或者我们把着色语句强制转换成(int),或者,改写成 i<Math.sqrt(begin)。

  修改之后成功运行,代码如下:

 1 import java.io.*;
 2 import java.util.*;
 3 public class number2 {
 4     public static void main(String[] args) throws IOException{
 5         int begin, end;
 6         String str;
 7         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 8         str = br.readLine();
 9         begin = new Integer(str);
10         BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
11         str = br1.readLine();
12         end = new Integer(str);
13         for (; begin != end; ++begin){
14             boolean b = true;
15             for(int i = 2; i < Math.sqrt(begin); ++i){
16                 if(0 == begin % i){
17                     b = false;
18                     break;
19                 }
20             }
21             if(b)
22                 System.out.println(begin);
23         }
24     }
25 }
关于代码中出现的输入输出流以后再做讨论。

时间: 2024-12-17 21:53:10

Java学习之路(五)--Thinking in Java的相关文章

Java学习之路(二) Java命令

1.java.exe:2.javac.exe:编译的Java程序编写的后缀为.java的文件,利用javac编译后会生成执行文件.class文件3.javaw.exe:运行Javac编译后生成的可执行文件.class文件,在执行图形界面的java程序运行java命令时,会出现一个console窗口并一直保持,并通过System.out将程序中的信息在console窗口内输出,avaw 大多用来运行GUI程序,运行javaw,JVM首先会调用控制台程序启动主程序,调用完主程序后就会隐藏控制台:4.

Java学习之路(五)

1:补充: 使用super也可以调用父类的成员函数  格式 :  super.函数名(); 2:抽象类与抽象函数 抽象函数的定义: 只有函数的定义,没有函数体的函数被称为抽象函数 抽象类的定义: 使用abstract定义的类被称为抽象类 注意: 1:抽象类不能被实例化 2:如果一个类当中包含有抽象函数,那么这个类必须被声明为抽象类 3:如果一个类中没有抽象函数,那么这个类也可以被声明为抽象类 抽象类不能生成对象  却可以有构造函数 如果一个不是抽象的子类继承了抽象类那就必须实现抽象(父)类中的所

Java学习之路(一)Java基础

Java命名规范 1. 项目名全部小写 2. 包名全部小写 3. 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写. 如:public class MyFirstClass{} 4. 变量名.方法名首字母小写,如果名称由多个单词组成,每个单词的首字母都要大写. 如:int index=0; public void toString(){} 5. 常量名全部大写 如:public static final String GAME_COLOR=”RED”; 6.所有命名规则必须遵循以

Java学习之路(一)Java基础知识

标识符(命名规范) 标识符由字母.数字.下划线.¥.$.中文组成: 首字母不能使用数字: 不能与系统关键字重名: 长度无限制,区分大小写: 类名:每个首字母大写: 包名:全部小写: 方法名:第一个单词小写,其他首字母大写: 变量:小写: 常量:大写: 基本数据类型 整数 byte 字节型 short 短整型 int 整数 long 长整型 基本数据类型 浮点数 double 双精度型 float   单精度型   字节型 char 0 —65535   布尔型 Boolean(true.fals

Java学习之路(二)--Thinking in Java

针对昨天Java学习之路(一)--Thinking in Java中的类的静态方法不能访问创建非静态类,给出了将内部类修改成为static静态类,操作方便简单.现在给出第二种不需要添加删除的另一种极为高效的方式.可以将内部类从你所创建的类中复制粘贴到类外,作为一个外部类,在static主方法中就可以创建类的引用了. 源代码如下: ? class test{ int s; char c; } public class test1 { public static class test{ int s;

java学习之第五章编程题示例(初学篇)

1 /* 2 Animal.java 3 */ 4 package animal; 5 6 public abstract class Animal { 7 public abstract void cry(); 8 public abstract String getanimalName(); 9 } 1 //Dog.java 2 package animal; 3 4 public class Dog extends Animal 5 { 6 7 String aa="旺旺"; 8

Java学习之路:1、HelloWorld

似乎每种语言都是从HelloWorld开始的,所以,我的第一个java程序,也应该是这样开始的! 1.配置好jdk后,开始编写HelloWorld.java package second;//这个应该在我的理解就相当于php的命名空间 public class HelloWorld {//如同php中的声明一个类,不过php是不需要加public这样的类型修饰符 public static void main(String[] args){//声明一个方法,不过不懂的是为什么一定要static:

mapxtreme java学习之路(1)——.dwg转.tab再转.gst详细教程

[背景] 因为项目的需要,需要在java web 项目中使用到地图,厂家提供的是dwg格式的地图,而我们采用的是mapxtreme java技术,所以先要把dwg格式的地图转成mapxtreme java可以解析的格式,即gst格式.关于这方面的资料,网上甚少,加上软件难找,中间走了不少弯路.基于mapxtreme java以后可能还要能到,dwg转gst的过程也必不可少,所以在这里整理一下整个转化过程.如果大家有更好的转化方法,欢迎讨论. [环境] windows xp 32 位 的虚拟机.

Java学习之路:2、Mysql 链接与查询

1.事实上我发现有了php的功力在里面,学习java起来还是不是很费劲,只是java就没有面向过程这一说 package second; import java.sql.*;//导入 public class mysql { public static void main(String[] args) throws SQLException{ String driver = "com.mysql.jdbc.Driver";//声明要被导入的类 String dsn = "jd

java学习之路—初级阶段(迷茫的大学)

本人现在大三,三本院校,电子信息专业.大三下学期才开始定位软件方向.真的是越上学越迷茫,真的不知道去干嘛,本专业本身就可以分软硬件两个方向,可我们都要学.最迷茫的时候,一直在玩游戏,因为真的不知道要去干嘛.知道的太少,心态消极,,,,,后来开始上网才知道原来很多人大学生和我一样迷茫,我们真的没了方向.当然也有些人一上大学就知道自己要干嘛,并且一直努力着.有时候真的很羡慕他们,当别人刚开始起步的时候,或许他们已经登上了顶峰,当然也怪自己的愚昧无知啦.好吧,感慨有点多,呵呵. 在网上混了好几天之后,