第三周博客问题总结

1.学会了```的用法 一开始并没有成功,后来发现是因为输入法没有切换成英文,今后这样的问题要避免出现。——20145106

2.问题:教材86页,Guess的代码,猜数字,不知道原先没有设定好一个数字,为什么可以在0-9之间猜中一个数

解答:百度了(Math.random()10)这行代码的意思,知道了(Math.random())的意思是在[0,1)之间随机产生一个数字,10,所以变成了[0,10)之间随机产生一个数字,所以可以进行猜数字

——20145123

3.IntegerCache.low默认值是-128,IntegerCache.high默认值是127(这不是出现得问题,但是一度记错范围)——20145123

!!!4.问题:true和false的判定,不能正确的根据代码判断出是ture还是false,这个问题目前还没解决——20145123

5.问题:%2d的意义

解答:百度得知输出为2位的固定位宽——20145123

6.看书上的注释只知道new int[2][]是声明arr参考的对象会有两个索引,但是长度不同的数组时怎么排列的不是很明白。看下面的循环语句应该是将两个已定义长度数组的值从行到列排序然后输出他们的值。——20145122

!!!7.不太理解为什么要进行基本类型打包,基本类型打包有什么作用?——20145120

8. 对1到100那个程序的运行结果截图的时候因为结果太长,很难截图,感觉应该是有结果自动换行功能的,找了一下,发现了应该是自动换行按钮的东西

还有显示代码行数的功能

——20145120

9. 在第四章的学习中,我在浮点数精确度的部分有些纠结,在判断运算结果时总会出错...Java中浮点数默认为double类型,且Java遵守IEEE 754浮点数运算规范,使用分数与指数来表示浮点数!!(即使程序中显示的是0.1,但实际内部表示为110!)

以后若想要得到"字面上的结果",需要使用标准类java.math.BigDecimal

 

(标准API由许多类组成,可以直接取用以免去重新打造基础的需求,一般包名称为java开头的类,表示标准API提供的类.)

——20145118

10.

一个 *.java 文件中,只能有一个public 的类,而且这个public修饰的这类必需要和这个文件名相同
问题出在文件命名上,应该命名为Sum.java

——20145110

11.书中P121的操作题1,是一个关于费氏数列的问题。其中用到了数组和java.util.Scanner.
代码如下:

import java.util.Scanner;

 

public class Fei1 {

public static void main(String[] args) {

Scanner s = new Scanner(System.in);

System.out.printf("求几个费氏数?");

int n=s.nextInt();

int arr[] = new int[n];

arr[0] =0;

arr[1] = 1;

for (int i = 2; i < arr.length; i++) {

arr[i] = arr[i - 1] + arr[i - 2]; }

System.out.printf("斐波那契数列的前%d项如下所示:",n);

for (int i = 0; i < arr.length; i++) {

System.out.println(arr[i]); }

}

}

截图如下所示:

不过所显示的结果是一行一个,看上去并不美观,不知道如何修改。希望老师能够指导。

肖昱学长的解答:

关于斐波那契数列:println自带换行,改成print然后字符串后面加个空格就好了。

——20145110

12. 在看书的过程中,作者提到这样的一个例子:
String text1 = "Ja"+"va";
String text2 = "Java";
System.out.println(text == text2);
当时没有继续往下看时,以为会输出false。但答案是true。后来作者通过反编译解释了这个问题。
"+"是链接字符,并不是新产生的字符串。
所以在学习过程中,各程序语言会有细微、重要且不容忽视的特性。在学习程序语言是,不得不慎。

——20145201

 

13.不知道p100、p102的代码中System.out.println()的意思。

解决过程:我进行了一下尝试:

我发现加上这句话的执行结果和书上是一样的。如果不加这句话,执行的结果就是这样的:

这是什么原因呢?难道这句话的作用仅仅是空格的作用?

娄老师回复:换行看不出来?(这句话就是换行的意思!)

——20145203

!!!14.调试代码的时候,我不明白这个代码为什么i++最后输出的结果会是10:

解决过程:我问了几个同学他们也对这个问题不太理解。只能理解为输出的时候还未进行++运算!

——20145203

!!!15.关于自动拆箱与装箱的问题

  1. 对象指定一相等性中我们知道对于基本类类型而言,"=="和"="前者用来比较参考名是否参考同一对象,所以类类型中不能草率的使用这两个符号。但是在章节自动装箱与拆箱中又可以直接比较两个对象中的内含值。是因为基本类型打包的表述方式不同所以有所区别吗?
  2. 凡是使用integer wrapper=10这样的方式jvm都会自动默认装箱与拆箱?在自动装箱与拆箱中"=="符号必须在指定的范围内才可以进行数值比较,那么用"="赋值操作有限定吗?
  3. 在课本上有这样一句话

"建立Integer时,使用Integer.valueof()。用这种方式建立实例,如果传入的int在IntegerCache.low与IntegerCache.high之间,就会看缓存中有没有打包过相同的值,如果有就会直接返回,如果没有就会用new建立新的实例。"

那么Integer i1=100;Integer i2=100;这相当于Integer i1=100;Integer i2=i1;那i1和i2有什么意义吗?同一个对象i2改变,那么i1也会改变啊?仅仅是为了比较数值大小吗?

——20145204

!!!16.还是有些不太清楚什么时候用printf、print、println,只知道println不仅可以输出还可以直接换行,在P85代码中,输出使用了println运行结果出现错误。
解决过程:还没有解决。

——20145206

!!!16.在编写代码的时候出现了一个没有解决的问题。

public class Average {

public static void main(String[] args) {

long sum = 0;

for (String arg:args){

sum +=Long.parseLong(arg);

}

System.out.println("平均:"+(float)sum/args.length);

}

}

上述代码的运行结果是
结果是NAN,这不是我想得到的,在网上查到NAN代表not a number,是因为程序中没有给定参数值的原因,但是我想按照书上的方法对其赋予参数变量,却提示无法找到相应的类,这个问题我研究了一会还是没有解决。

——20145208

17.p108 Sum.java:输入11.1试试,会是什么效果?如果有问题怎么解决?
输入了11.1之后出现了错误如图

阅读之后发现是因为参数定义的是整型,所以只需要修改为浮点数就可以了,代码如下:

import java.util.Scanner;

 

public class Sum {

public static void main(String[] args) {

Scanner scanner=new Scanner(System.in);

float sum=0;

float number=0;

do {

System.out.print("输入数字:");

number=Float.parseFloat(scanner.nextLine());

sum+=number;

}while (number!=0);

System.out.println("总和:"+sum);

}

}

结果如图,果然可以了:

——20145208

18.p85 Field2.java: 构造方法的使用,构造方法决定了生成对象的方式
按照教学指导上面说的加了一行加一行Clothes2 autumn = new Clothes2();发现不能运行;

原因是实际参数列表和形式参数列表的长度不同,就是新加的一行与形式参数长度存在差异。

——20145208

19.在代码编译中我遇到了GBK码的一些问题,一些包含汉字的文件我在IDEA是可以正常的运行,但是在cmd上运行就会出现错误,下面是任务日志的内容:

然后我通过上网查找相应的解决方案,发现应该是文件编码方式的问题,只要改成如下方式就可以正常编译运行了:

——20145208

20.问题:

对教材P93页的两段代码不是很理解,"=="什么时候能看做是指定参考名称到某个参考对象?

解决:

通过不断翻阅之前的知识点,我对这两段代码的理解如下:之前的代码没有经过打包,这两段代码因为有"Integer"进行打包,所以看作指定参考名称到某个参考对象,在这两段代码中,两个参考名称的两个对象虽然内含值相同,但是两个对象打包后,若iIntegerCache.lowIntegerCache.high之间,会从缓存中传回Integer实例,第一段代码中,因为i1i2的值相等,所以从缓存中传回的是同一个实例,但第二段代码中,iIntegerCache.lowIntegerCache.high之外,直接建立新的 Integer实例,新建立的实例虽然内含值相同,但并不是同一个实例。

——20145210

21.问题:

在学习第五章的时候没有办法区分函数和方法

解决:

上网查了下资料,理解了java里方法和函数的异同:二者本质上是一样的,在java中一般把类里面的函数叫方法,主要强调这个类的对象封装了一些属性和方法,并向外提供服务

——20145210

22.问题:

IDEA里敲代码的时候,会编译不通过,出现以下问题:

解决方案:

之前一直是把public去掉,这样也能运行,但是通过对第四章的学习,知道了一个原始码中可以有多个类定义,但只能有一个是公开类,且文档中的主文档名必须与公开类名称相同,之前操作时一直在同一个主文档里操作,导致主文档名与公开类名不相同,现在每次编写程序都会新建一个文档,问题解决了。

——20145210

23.问题:

这周做了一下书后的操作题,在编写费氏数列的程序时,运行出现了"可能尚未初始化变量"

解决方案:

果然看书看懂了和练习不一定能做好,因为对C语言进行过很多练习,在编写程序的时候把C语言初始化变量的语法用在java里了,更改后的代码如下:

import java.util.Scanner;

 

public class Fibonacci {

public static void main(String[] args){

Scanner scanner = new Scanner(System.in);

int n;

Integer[] f = new Integer[100];

f[0] = new Integer(0);

f[1] = new Integer(1);

System.out.print("求几个费式数?");

n = Integer.parseInt(scanner.next());

if(n == 0||n == 1){

System.out.printf("%d",n);

}

else if(n > 1){

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

if(i > 1) {

f[i] = f[i - 1] + f[i - 2];

}

System.out.printf("%3d",f[i]);

}

}

}

}

运行结果如下:

——20145210

24. 代码调试中的问题和解决过程

这个代码我照抄教材,然而却执行失败,很费解。我也想知道为什么这个代码没有公开类

 

class CashCard{

String number;

int balance;

int bonus;

CashCard(String number,int balance,int bonus){

this.number = number;

this.balance = balance;

this.bonus = bonus;

}

void store(int money){

if(money >= 0){

this.balance += money;

if(money >= 1000){

this.bonus++;

}

}

else{

System.out.println("储值是负的?");

}

}

void charge(int money){

if(money >= 0){

if(money <= this.balance){

this.balance -=money;

}

else{

System.out.println("钱不够啦");

}

}

else{

System.out.println("扣负数?这不是叫我储值吗?");

}

}

int exchange(int bonus){

if(bonus >= 0){

this.bonus -= bonus;

 

}

return this.bonus;

}

}

高其解答:

对于你的问题,我的理解是,这个CashCard类的代码本身是没什么大问题,首先这不是因为没有公开类而执行失败,这个代码在编译中不会报错,执行时就会报错,因为缺少main方法,没有main方法,JVM就找不到程序的入口,所以不能被执行。结合课本的内容不难发现,这个代码就是对象封装的典型实例,是用来和这个CardApp公开类一起使用的。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24 

import java.util.Scanner;

   

public class CardApp {

   

    public static void main(String[] args) {

        Scanner console = new Scanner(System.in);

   

        CashCard card1 = new CashCard("A001", 500, 0);

        card1.store(console.nextInt());

   

        CashCard card2 = new CashCard("A002", 300, 0);

        card2.store(console.nextInt());

   

        CashCard card3 = new CashCard("A003", 1000, 1);

        card3.store(console.nextInt());

   

        System.out.printf("明细 (%s, %d, %d)%n",

                card1.getNumber(), card1.getBalance(), card1.getBonus());

        System.out.printf("明细 (%s, %d, %d)%n",

                card2.getNumber(), card2.getBalance(), card2.getBonus());

        System.out.printf("明细 (%s, %d, %d)%n",

                card3.getNumber(), card3.getBalance(), card3.getBonus());

    }

} 


也就是当你编译CardApp类时,JVM会尝试的在同级别文件夹中搜寻CashCard.java文件,从而识别CashCard类类型变量和CashCard类的方法。
所以CashCard类本身是不单独用的,所以没定义main接口(独立运行时会报错),只是用于CardApp类的调用。

——20145213

25. 教材学习中的问题和解决过程

  • 问题:a.add(b).add(c).equals(result)的写法是固定的么?
  • 解决:尝试了a.add(b).equals(result)a.equals(result)写法,发现程序都能编译成功并且得到正确的结果,深入学习后发现equals()可以自行定义如何比较两对象的内含值并且不同于 == 。操作过程及截图如下。
    尝试的运行结果为

    尝试的运行结果为

    ——20145214

    26.问题:在调试使用java.util.Scanner的代码中打印提示语"猜数字""猜中了"时出现错误。

  • 解决:将两句话改为英文描述时运行成功了,但是仍然不清楚为什么用中文会运行失败。

    ——20145214

    27.问题:尝试运行书本137ObjectInitialBlock.java代码时出现错误。

  • 解决:反复对照后没有发现程序输入的错误,但无法解决运行时出现的错误。

 

——20145214

28.教材上109页的Average代码运行完成后,结果如下:

一开始并不知道NaN是什么,后来百度后发现NaNnot a number的缩写,在IEEE浮点数754中定义,表示一些特殊数值(无穷与非数值),本题中没有输入,自然也就没有数值了。

——20145215

29.在对课本上109Average代码进行编译时弹出如下错误:

解决过程:通过百度找到了解决方法,首先用记事本打开java源文件,然后另存为,选择ANSI编码,再保存确认覆盖就好了。

30.下面代码无法进行编译:

  • public class ObjectInitialBlock{
  • class Other{
  • {
  • System.out.println("对象初始区块:");
  • }
  •  
  • Other(){
  • System.out.println("Other() 构造函数");
  • }
  •  
  • Other(int o){
  • this();
  • System.out.printf("Other(int o) 构造函数");
  • }
  • }
  •  
  • public class ObjectInitialBlock{
  • public static void main(String[] args) {
  • new Other(1);
  • }
  • }

    }

    弹出如下错误:

后来发现在用IDEA一开始编代码的时候,系统自动给了public class ObjectInitialBlock,当时没有注意,直接在ObjectInitialBlock类中继续敲代码,所以弹出了类名重复的错误。

——20145215

31. 问题1

没有看懂书上p86页代码中的:

int number = (int)(Math.random()*10);

解决过程:

通过上网百度,得到如下解释:

Math.random()是令系统随机选取大于等于0.0且小于1.0的伪随机double值,是Javajs等语言常用代码。
					

 

例如:Number=Math.random()*2+1,即设置一个随机13(取不到3)的变量。
					

——20145216

32问题2

由于以前学的for循环语法都是:

for(初始式;执行结果必须是boolean的重复式;重复式){

描述句;

}

所以当看到书上p96页的for循环语法时(具体语句如下),便感到很难理解。

for(int score:scores){

System.out.printf("学生分数:%d %n",score);

}

解决过程:

通过反复看书上的解释和上网查找资料,我知道了该语法是增强式for循环,执行结果其实与以前学的for循环语句相同
					

 

,但是编写代码时会更简洁方便。其具体执行过程是:上面的程序片段取得scores数组第一个元素,指定给score变量
					

 

后执行循环体,接着取得scores中第二个元素,指定给score变量后执行循环体,依次类推,直到scores数组中所有
					

 

元素都访问完为止。
					

——20145216

33.问题1

当敲到书上p124页的代码时,运行结果有问题,具体代码与错误如下:

解决过程:

经过反复看书中的代码实例与文字解析,我明白了该段代码中调用了函数,而书中给的代码并不完整,缺少构造函数的部分,因此出现如图所示错误,于是,我试着将构造函数的代码片段补上,重新运行,最后运行成功,代码与结果如下:

总结:Java的构造函数语法,能够实现对象初始化流程的封装,封装对象初始化流程的好处是用户不用重复撰写对象初始化流程,甚至不需要知道对象如何初始化,并且只要修改构造函数的内容,重新编译并给予位码文档之后,用户便无须再修改程序。

——20145216

34.问题2

在敲书上P128页的代码时,发现它与124页的代码有相同的问题,于是我再次补上构造函数的代码,原以为这次会万无一失,结果运行时又出现了一个错误,截图如下:

解决过程:

由于这个错误与之前的错误类似,所以我认为应该也是缺少了某些代码片段,于是我又回归教材,很快我便知道了错误所在,该段代码直接使用了store()方法,而没有定义储值用的store()方法,同样,我加上定义store()方法的代码后,程序便运行成功,截图如下:

——20145216

 

 

 

 

 

35.

课本上的代码敲上去之后却运行不了,出现了上图中的错误。

宋歌解答:

应该是因为你没有class CashCard吧,主程序没有可以调用的CashCard程序。class CashCard就在书上p127最上面。

——20145218

36.

问题:在编译书上p96Score程序时,我错将System.out.printf("学生分数:%d %n",scores[i])打成System.out.println("学生分数:%d %n",scores[i]),结果弹出来很多错误。在上一章中书上说System.out.printf是按格式输出,而System.out.println是输出后换行,如果仅仅只是换行的差别的话那为什么用后面一种不行呢?我也有试着将输出中的%n删去 ,但依旧是错的。

解决方法:还没解决......

解答:#1 2016-03-20 17:34 20145208蔡野  

对于printfprintln的区别,小明在这里有解释
小明:
这主要是因为println是用于输出参数内容,然后换行,其参数个数固定为一个,而printf是用于输出带各种数据类型的占位符的参数,其参数个数是不定的,所以上面的代码应该用printf

 

——20145219

 

37. 教材学习中的问题和解决过程

刚开始定义类时,将ClothesField都定义成public类,一个原始码中可以有多个类定义,但公开类只能又一个,因此将Clothes改为非公开,文件名也修改为Field就可以了。

修改后:

——20145220

38.

输出时习惯性的写成了println,因此出现以下错误,println的参数只能是一个,而printf的参数是不定的,适用于格式化输出的,在其后面加%d(自动回车换行)。

修改后:

 

——20145220

39.运用递归速度变慢的原因是,没一个斐波那契数的生成都需要从fib(n)递归到fib(1),大大影响了代码的运行效率;寒假的代码,则通过数组存储前面每一个值,在进行后续的运算时直接调用即可。所以,一个程序的编写会有多种不同的算法,只有自己试验后,才能判断出代码的好坏,好的保留,坏的改进。

——20145221

  • 40. 不太明白sun.colorspring.color的意义,如图:

  • 解决过程:通过Field2比较明白了sunspring是使用了指定构造函数建立对象,如图:
  • 数组的length属性可以取得数组长度,也就是数组元素的个数,如图:

  • 如果事先不知道元素值,只知道元素个数,那可以使用new关键词指定长度来建立数组,例如:int[] scores=new int[10];Java中只要看到new,一定就是建立对象,这个语法代表了数组就是对象,如图:
  • 封装目的主要就是隐藏对象细节,将对象当做黑箱进行操作。private也可以用在方法或构造函数声明上,私有方法或构造函数通常是类内部某个共享的演算流程,外界不用知道私有方法的存在,如图:

——20145222

41.

在编写有关使用java.math.BigDecimal的程序时,我遇到了这样的问题,导致我的程序出现了编译错误:

我仔细检查了一遍,发现并没有什么问题……它告诉我"if,但是没有else",可是我明明就把else打上去了啊,怎么会没有else?所以我只好求助万能的网络,把出现错误提示的关键字复制下来放到了百度里,结果搜出来发现别人也和我出现了一样的错误。最终我找到了原因,那就是我在if(条件)后面多加了一个分号,去掉分号之后程序就能正常运行了。(编程序真是不能大意啊。)

——20145223

42.一开始我就是直接按书上代码敲上去,后来就编译出错了,说定义类重复,并在"Run"当前代码时将有重复定义类的那个文件也弹出来了,于是我就给类名称后都加上了序号问题就解决了。还有在src的文件中只要有编译不通过的文件,无论它是不是你当前正在"Run"的代码,系统都会给你把那个有错误的文件找出来的

——20145224

43.过构造方法(构造函数)封装初始化流程时,教材上说构造函数是与类���称同名的方法,不用声明返回类型,但是编译时一直显示"方法声明无效,需要返回类型"。如下图所示:

解决途径:尚未解决。

荆玉茗回答:p128页代码的问题,文件名是CashApp public class中的是CardApp~~~~

——20145227

44. 教材学习中的问题和解决过程

String text1="Ja"+"va";

String text2="Java";

System.out.println(text1==text2);

书中问到这样的代码是false还是true,我刚开始认为是错误,因为觉得两个字符串不能简单相加。但后买才知道最终的结果是true,因为我们的编译程序就是会认为我们要得结果就是"java",也就是说,我们确实可以将两个字符串简单相加。

Integer i1=200;

integer i2=200;

if(i1==i2){

System.out.println("i1==i2");

}

else{

System.out.println("i1!=i2");

}

上面这个代码的结果竟然是"i1!=i2",但我很疑惑,明明都是200,为什么i1就不等于i2呢?后面我知道,自动装箱与拆箱的功能其实是编译程序的蜜糖,它能让我们尝到甜头,但也会让我们看不清代码背后的真理。由于IntegerCache.low默认值是-128IntegerCache.high默认值是127,所以200在这个范围之外,所以i1i2不会参考到同一个Integer实例上,也就有了上面的效果。

代码调试中的问题和解决过程

不知道这个代码调试出错是什么意思。

蔡野回答:你的错误是因为在定义sum的时候用了Long关键字,将Long改成long就可以啦~

——20145230

45. 教材学习中的问题和解决过程

书中代码

Integer i =10;

System.out.println(i+10);

System.out.println(i++);

认为会显示2011,正确应该是201010会先装箱,然后在i+10时会先对i进行拆箱,再进行加法运算;i++该行也是先对i拆箱再进行递增运算。递增是最后的操作,只有在输出后才会递增的。

代码调试中的问题和解决过程

import java.util.Scanner;

public class Guess

{

public static void main(String[] args)

{

Scanner scanner = new Scanner (System.in);

int number = (int) (Math.random() * 10);

int guess;

 

do

{

System.out.printf("GUESS A NUMBER:");

guess = scanner.nextInt();

}

while(guess != number);

 

System.out.println("YOU ARE RIGHT!");

 

}

}

import java.util.Scanner使用import告诉编译程序想偷懒 如果没有就会出现编译错误,除非每次都输入java.util.Scanner。在创建Scanner实例时使用System.in输入。
刚开始不太理解其中一些代码函数,查阅资料才知道Math.random()是令系统随机选取大于等于 0.0 且小于 1.0 的伪随机double值,*10并强制转换成int型,可以生成1~10
的随机整数。而guess = scanner.nextInt();要求猜出这个整数,直至猜对会显示"YOU ARE RIGHT"

书中109的代码不太理解

public class Average{

public static void main(String[] args){

long sum=0;

for(String arg : args){

sum +=Long.parseLong(arg);

}

System.out.println("平均:"+(float) sum/ args.length);

}

}

出现了NaNNot a NumberNaN 用于处理计算中出现的错误情况。代码中没有输入,所以没有办法计算出所有整数的平均。

——20145232

46. 我的代码在编写的过程中因为对定义的不完全理解,导致了一些错误,就是上面这个==equals的问题,使得程序无法正确的像我所希望的那样进行,在仔细看书并且重新改写代码之后,程序可以良好的运行。
正确的代码编写:

——20145233

 

47.

代码调试中的问题和解决过程

·有问题的代码如下

public class Averagr {

public static void main(String[] args) {

long sum=0;

for(String arg : args){

sum += Long.parseLong(arg);

}

 

System.out.println("平均:" +(float)sum/args.length);

}

}

出错结果

另一个出错代码

import java.util.Scanner;

public class CashCard {

public static void main(String[] args) {

CashCard[] cards = {

new CashCard("A001",500,0),

new CashCard("A002",300,0),

new CashCard("A003",1000,1),

 

};

 

Scanner scanner = new Scanner(System.in);

for(CashCard card : cards){

System.out.printf("为(%s,%d,%d)储值:",card.number,card.balance,card.bonus);

card.store(scanner.nextInt());

System.out.printf("明细(%s,%d,%d)%n",card.number,card.balance,card.bonus);

}

}

 

}

出错结果

不太清楚第一个问题所在
对于第二个代码,出错问题在于public类的名称与书上的文件名不一致,照着书敲代码也不能不经过大脑思考,对照之前自己应该先思考应该写的什么然后在通过书检查正误。

——20145237

 

 

48.

教材学习中的问题和解决过程

刚开始定义类时,将Clothes和Field都定义成public类,一个原始码中可以有多个类定义,但公开类只能又一个,因此将Clothes改为非公开,文件名也修改为Field就可以了。
							


  • 修改后:

代码调试中的问题和解决过程

输出时习惯性的写成了println,因此出现以下错误,println的参数只能是一个,而printf的参数是不定的,适用于格式化输出的,在其后面加%d(自动回车换行)。
									


  • 修改后:

——20145240

49.教材学习中的问题和解决过程

  • 问题1教材P88说明BigDecimal提供加减乘除的运算,其中""plus(),而下面的程序利用的是add(),这二者一样吗?
  • 解决过程1 百度上没有相关问题,尚未解决。
  • 问题2教材P92关于装、拆箱问题不明白,下例显示结果为2010,为何不是2021

Integer i=10;

System.out.println(i+10);

System.out.println(i++);
							

  • 解决过程2我想到了第三章的第八题,困惑为何第八题i的值是叠加进行的,到这里就不一样了,也许因为这里是输出的原因,然后意识到i++是一个整体,输出i++意味着:输出=i,i=i+1;,所以输出为2010
  • 问题3教材P119第一题我以为显示结果应该是falsefalse,不明白为何是tureture
  • 解决过程3又对比了一下书本前方的内容,发现在对象指定与相关性那部分的内容中,程序利用new关键词建立了新的对象,所以二者不相等,而本题不是。
  • 问题4教材P93关于编译程序蜜糖的内部为何那么展开很不明白。
  • 解决过程4询问了周围的同学,大家都不清楚,尚未解决。

    ——20145302

50. 代码调试中的问题和解决过程

1

class Car {

 

String color = "红色";

int num = 4;

void run()

{

System.out.println(color+".."+num);

}

 

 

}

class Example

{

public static void main(String[] args)

{

Car c = new Car();

c.num=5;

Car c1 = new Car();

c1.color="绿色";

c1.run();

 

}

}

绿色..4

2

class Car {

 

String color = "红色";

int num = 4;

void run()

{

System.out.println(color+".."+num);

}

 

 

}

class Example

{

public static void main(String[] args)

{

Car c = new Car();

c.num=5;

Car c1 = c;

c1.color="绿色";

c1.run();

 

}

}

绿色..5

上面是两个程序的代码及结果,我觉得特别容易搞混。

第一个是c = new Car();``````c1 = new Car();,由于两个在堆内存中的存放地点不同,所以c并不会影响到c1
而第二个c = new Car();``````c1 = c;,两个在对内存放的地方是一样的,所以互相会影响。

——20145303

51. 教材学习中的问题和解决过程

  • 在学习标准类时,不理解书上列举的标准类是什么类。
    解决过程:学习查询Java API文件,上百度搜索。
  • 在学习P105页的代码时,对于代码中不影响score1的参考数组对象不太理解。
    解决办法:改写了程序,将所有数据输出,对比差距。
  • 不太理解书上P129页的代码。
    解决过程:将代码敲了一遍,但运行不出来,觉得少了public,仔细阅读教材,发现其只是修改了一个函数,放入原程序后,得出结果。

代码调试中的问题和解决过程

  • 在使用标准类java.math.BigDecimal时,代码完成后,出现如图错误。

解决过程:仔细查看代码,发现使用equals()时,少写了s

  • 使用标准类java.util.Scanner时,调试书上代码,代码无错误,但无法显示结果,如图:

解决过程:需要自行输入数字。

——20145304

52. 教材学习中的问题和解决过程

P101

package cc.openhome;

 

public class IrregularArray {

public static void main(String[] args) {

int[][] arr = new int[2][];

arr[0] = new int[] {1, 2, 3, 4, 5};

arr[1] = new int[] {1, 2, 3};

for(int[] row : arr) {

for(int value : row) {

System.out.printf("%2d", value);

}

System.out.println();

}

}

}

代码中的int[2][]只提供了第一个数值,但是2是两个索引吗还是两个对象

P136页提到的编译程序在处理重载方法时,处理的顺序还不理解

代码调试中的问题和解决过程

P139页中Something(int x)版本的构造函数对final对象成员x设值,但用户调用了Something()版本的构造函数,x不会被设值,所以编译错误。为什么改为一下代码就可以通过编译

class Something {

final int x;

Something(){

this(10);

}

Something(int x){

this.x=x;

}

}

——20145305

53. 教材学习中的问题和解决过程

关于BigDecimal的精度问题 这种import引用虽然精度高,但因为存在无限循环小数的原因会让循环结构导致程序垮掉,所以还是要用语句让小数点后固定一定的数字。

关于数组内写入数据后循环结构在printf的时候会出现不定对象使结构崩溃的现象。掉换顺序定制数组数目就好了。

——20145307

54. 教材学习中的问题和解决过程

  • 问题:对于参考名称、对象之间的关系不明白
  • 解决过程:看了老师给的学习指导,仔细的看了书上的参考图,理解了参考名称和参考对象的关系

代码调试中的问题和解决过程

  • 问题
  • 代码

class CashCard {

String number;

int balance;

int bonus;

CashCard(String number,int balance,int bonus){

this.number = number;

this.balance = balance;

this.bonus = bonus;

}

}

public class CashApp{

public static void main(String[] args){

CashCard[] cards = {

new CashCard("A001",500,0),

new CashCard("A002",300,0),

new CashCard("A003",1000,1),

new CashCard("A004",2000,2),

new CashCard("A005",3000,3),

};

 

for(CashCard card : cards){

System.out.printf("(%s,%d,%d)%n",card.number,card.balance,card.bonus);

}

}

}

  • 运行结果
  • 解决过程
    发现是声明为public的类和另一个类的名称写反了,声明为public的类名需要和文件名称相同,调用其他类时包括新建对象一定要注意名称书写准确

class CashApp {

String number;

int balance;

int bonus;

CashApp(String number,int balance,int bonus){

this.number = number;

this.balance = balance;

this.bonus = bonus;

}

}

public class CashCard{

public static void main(String[] args){

CashApp[] cards = {

new CashApp("A001",500,0),

new CashApp("A002",300,0),

new CashApp("A003",1000,1),

new CashApp("A004",2000,2),

new CashApp("A005",3000,3),

};

 

for(CashApp card : cards){

System.out.printf("(%s,%d,%d)%n",card.number,card.balance,card.bonus);

}

}

}

——20145308

55. 代码调试中的问题和解决过程

这次的代码比较多,所出现的问题也比较多。

上图的原因找了好久,原来是最后一个括号不是英文环境下的括号。

显然大括号与普通括号没有分清。

这个是ScoreS小写了。在java中是很严格的区分大小写的。

Import一行也是需要写分号的。

这是因为最后的大括号个数错误、

这也是大小写问题造成的。

同时我还在编写过程中遇到了汉字编码的问题,我打算写一篇博客讨论这个问题。

——20145310

56. 教材学习中的问题和解决过程

  1. 问题:在做教材81页的程序练习时,把类定义为Clothes出现错误。
    解决过程:在仔细阅读教材后知道了,在这个Field.java中,定义了两个类,一个是公开的Field类,所以文档主文档名是Field,另一个是非公开的Clothes
  2. 问题:在自己编写程序时分不清printlnprintf的区别。
    解决过程:在博客园中看到有的同学发布的话题,其中有关这方面的解答。
    解决结果: printff就是format的意思,也就是格式化,是对输出文字做格式化后再显示在文本模式中。后面常用%d,%f,%b…这些格式控制符号,一般在输出变量类型比较多的时候使用,也用在需要计算机计算或判断后再输出的情形。
    print
    :将它的参数显示在命令窗口,并将输出光标定位在所显示的最后一个字符之后。
    println
    :将它的参数显示在命令窗口,并在结尾加上换行符,将输出光标定位在下一行的开始。相当于在print中加了一个%n换行符。当输出信息比较单一简单时,一般采用println,但println也可以用于多种变量类型的输出,中间用"+"连接,例如System.out.println("3 + 3 = "+a) //这里假设程序中a=6,可能这个例子不算太恰当,但代码中的+前后连接了不同的类型,也可以用println输出。

代码调试中的问题和解决过程

  1. 问题:在编写教材109页的练习时,不理解运行结果的含义,代码如下:
  2. public class Average {
  3. public static void main(String[] args){
  4. long sum=0;
  5. for(String arg:args){
  6. sum+=Long.parseLong(arg);
  7. }
  8. System.out.println("平均:"+(float)sum/args.length);
  9. }

}

结果如下:

平均:NaN

解决过程:未解决。

——20145312

57. 教材学习中的问题和解决过程

这次学习时,遇到一个问题,浮点类型能不能用 == 进行比较,只知道尽量不要使用 == 对浮点数进行比较。我对这个问题比较好奇,因为当时C语言的时候没有深入探究过,今天就好好研究一次。

首先我们要了解浮点数在计算机中怎么存放的。我百度了一下,上面是这样说的,浮点数普遍的作为实数运算的近似值的计算,是很有用的。

这里说的是实数的近似值的计算,所以浮点数在计算机中其实是一种不精确的表示。它存在舍入(rounding)误差。IEEE浮点标准用符号,尾数和阶码将浮点数的位表示划分为三个字段,单精度为32位,双精度为64位,因为表示方法限制了浮点数的范围和精度,浮点运算只能近似的表示实数运算。而 == 表示的是在计算机中的内存表示完全一样,这样使用 == 来表示两个浮点数的相等就会出现问题了。

代码调试中的问题和解决过程

本次我没有编写自己的代码,都是模仿书上的代码。但是我看见了陈俊达同学所改进的一次代码。即用decimal类型进行devide。结果4除以3,结果无法显示出来。

后来询问过老师后发现,输出时还需要加一个括号,括号中将录入一定的精度,从而才能完成显示。但这种方式实用性不高,这边就不再深究了。

——20145314

58. 代码调试中的问题和解决过程

课后作业题3(进阶版 冒泡法)

  1. 代码:

       

     2.  运行结果:

   

这里因为c语言习惯性思维,认为int[]maopao=new int[5319];即定义出一个可以存储5319个数的空数组,其实是定义了一个含53190的数组,所以在输出结果时,for(int jieguo:maopao)因为数组输出结果太多,从而导致了结不能正常输出结果。

       3.  修改代码:

       

       4.  运行结果:

修改过后程序就可正常输出结果

——20145319

59. ## 代码调试中的问题和解决过程
xxx
命令提示符中不能显示中文字,后来上网查发现要在Editplus里面设置文件编码为ANSI格式,然后直接保存还是不能正常显示中文,必须重新写一个JAVA程序才能实现。 xxx

##
其他(感悟、思考等,可选)
xxx
第四第五章内容比较多,而且代码好多啊。不过自己一个个的去敲出来并且修改错误还是很有感触,尤其是第五章CashAPP那两个代码,好多细节错误,敲代码还是要很仔细的去看和想。 Xxx

——20145322

60. 教材学习中的问题和解决过程

  • 问题 P1548题,程序片段 for 循环初始条件,i = 10;,我觉得它应该想写的是i = 0;。还有 C 选项,Some.sum(new int[1,2,3]),答案说是对的,我觉得正确的应该是 Some1.sum(new int[]{1,2,3})
  • 解决过程 原代码
  • class Some1 {
  • public static int sum(int... nunber) {
  • int sum = 0;
  • for (int i=0;i<nunber.length;i++){
  • sum+=nunber[i];
  • }
  • return sum;
  • }
  • }
  • class UseSome2{
  • public static void main(String[] args) {
  • int some1=Some1.sum(1,2,3);
  • int some2=new Some1().sum(1,2,3);
  • int some3=Some1.sum(new int[1,2,3});
  •  
  • System.out.println(some1);
  • System.out.println(some2);
  • System.out.println(some3);
  • }

}

显示结果为

修改后代码为

class UseSome1{

public static void main(String[] args) {

int some1=Some1.sum(1,2,3);

int some2=new Some1().sum(1,2,3);

int some3=Some1.sum(new int[]{1,2,3});

 

System.out.println(some1);

System.out.println(some2);

System.out.println(some3);

}

}

结果为

代码调试中的问题和解决过程

代码调试中,问题不太大。对于P121的操作题2,如果用 1+(int)Math.random()*50+(int)Math.random()*10/3来操作,可以直接表示1~52张不同花色的牌,然后用 Switch 来排列,并用数组记住已经出现过的牌,防止再次出现,可以是可以,但是写的东西会很多;倒是可以用2 switch 分别装数字和花色,但是,在判断不能重复的时候,却很麻烦,我能想到的就是用数组才存用过的牌,但不知道有没有什么比较简便的 方法可以用来排除使用过的牌,确保使用过的牌不会重复使用。

——20145325

61. 就像我之前所说的,第四章第五章的知识较之前的知识更为复杂抽象难懂,最开始我看第四章的时候搞不懂对象的概念,觉得太抽象了,包括其中的this.color=color,我不知道左右两边的color各是什么意思。不过遇到难题,我当然不会放弃,要想办法努力克服!不懂的知识点我看了一遍看两遍,如果还不懂就上网查或翻阅参考书。最终我将所有知识点的思路都理清了。比如之前这个问题,其实左边是对象成员,右边是参数,表明color这个对象成员能够拥有color参数的个别值! 学习第四章第五章,最重要的是要有能将抽象问题具体化的能力,将其建立成一个模型,这样才能方便理解。

   

——20145326

62. 教材学习中的问题和解决过程

CashCard.javaCardApp.java: 用方法(函数)封装操作
DRY
是去除重复代码的有效手段

代码调试中的问题和解决过程

P124 代码 按照书上敲的,可是运行错误
package cc.openhome;

public class CashApp {

public static void main(String[] args) {

CashCard[] cards = {

new CashCard("A001",500,0),

new CashCard("A002",300,0),

new CashCard("A003",1000,1),

new CashCard("A004",2000,2),

new CashCard("A005",3000,3),

};

for(CashCard card : cards){

System.out.printf("(%s,%d,%d)%n",card.number,card.balance,card.bonus);

}

}

}

尚未解决  且这个代码中的;为什么是在} new对象后的符号为什么是,

——20145327

63. 调试书上P105ShallowCopy代码的时候按照书上输入如下代码:

package week3;

/**

* Created by Administrator on 2016/3/19.

*/

class Clothes{

String color;

char size;

Clothes(String color,char size){

this.color = color;

this.size = size;

}

}

public class ShallowCopy {

public static void main(String[] args) {

Clothes[] c1 = {new Clothes("red",'L'),new Clothes("blue",'M')};

Clothes[] c2 = new Clothes[c1.length];

for (int i = 0; i < c1.length;i++){

c2[i] = c1[i];

}

c1[0].color = "yellow";

System.out.println(c2[0].color);

}

}

出现如下问题

根据错误信息发现错误原因是类重复,将上述程序修改为如下代码后即可运行正常

package week3;

/**

* Created by Administrator on 2016/3/19.

*/

class Clothes3{

String color;

char size;

Clothes3(String color,char size){

this.color = color;

this.size = size;

}

}

public class ShallowCopy {

public static void main(String[] args) {

Clothes3[] c1 = {new Clothes3("red",'L'),new Clothes3("blue",'M')};

Clothes3[] c2 = new Clothes3[c1.length];//复制元素?

for (int i = 0; i < c1.length;i++){//复制元素?

c2[i] = c1[i];

}

c1[0].color = "yellow";//通过c1修改索引0对象

System.out.println(c2[0].color);//通过c2取得索引0对象的颜色

}

}

而在运行如下程序时

package week3;

/**

* Created by Administrator on 2016/3/19.

*/

public class Average {

public static void main(String[] args) {

long sum = 0;

for (String arg :args){

sum += Long.parseLong(arg);

}

System.out.println("平均:"+(float) sum / args.length);

}

}

运行结果如下所示

阅读教材后发现原因是在运行时应一并指定命令行自变量,运行指令应为java week3.Average 1 2 3 4

则在命令行模式下运行结果如下图所示

在通过运行git bush时出现如下提示

通过查阅网页发现提示原因为:

windows中的换行符为 CRLF 而在linux下的换行符为LF,所以在执行add . 时出现提示

解决办法:

git中输入 rm -rf .gitgit config --global core.autocrlf false

然后重新运行

git init

git add .

即可

——20145328

 

64. 问题一:构造函数的具体用法?
解决:查阅得知,构造函数是与类名称同名,无须声明返回类型的方法

public class Some{

...

public Some(int a,String text)

...

}

问题二:打包基本类型是怎么实现的?
解决:例如:用Integer打包int型数据,可以用new创建Integer实例时传入int数据
问题三:什么事浅层拷贝,什么是深层拷贝?
解决:`

浅层复制:参考对象可以通用,没有实际复制出cloehes对象

for(int i=0;i<c1.length;i++){

c2 [i]=c1[i];

}

 

深层复制:c1每个索引参考的对象都会被复制

 

for(int i=0;i<c1.length;i++){

Clothes2 c=new Clothes2(c1[i].color,c1[i].size);

c2 [i]=c;

}`

问题四:

`package cc.openhome;

import java.util.Scanner;

public class Sum {

public static void main(String[] args) {

Scanner scanner=new Scanner(System.in);

long sum=0;

long number=0;

do{

System.out.printf("输入数字:");

number=Long.parseLong(scanner.nextLine());

sum+=number;

}while(number!=0);

System.out.println("总和:"+sum);

}

}`

代码是如何运行出总和的(System.out.println("总和:"+sum);)?
解决:显示每一个输入的数是 Scanner scanner=new Scanner(System.in)扫描显示;问百度,sum+=a 就是sum=sum+a;的意思,得最终和
问题五:op1.add(op2).add(op3).equals(result)是什么用法?
解决:调用add()方法得到它们的和,再调用equals()进行判等

问题六:
package cc.openhome;

public class Average {

public static void main(String[] args) {

long sum=0;

for(String arg:args){

sum+=Long.parseLong(arg);

}

System.out.println("平均:"+(float)sum/args.length);

}

}

为什么返回值为:平均:NaN
解决:没有提供整数

代码调试中的问题和解决过程

问题1

package cc.openhome;

 

class Clothes{

String color;

char size;

}

public class Field {

public static void main(String[] args) {

Clothes sun= new Clothes();

Clothes spring=new Clothes();

 

sun.color ="red";

sun.size = "S";

spring.color="green";

spring.size="M";

 

System.out.printf("sun(%s, %c)%n",sun.color,sun.size);

System.out.printf("spring(%s, %c)%n",spring.color,spring.size);

}

}

错误:java:不兼容的类型:java.lang.String无法转移为char

解决:java.lang.Stringchar,仔细检查代码发现着急把字符S""括住,而不是''

问题2

package cc.openhome;

class Clothes {

String color;

char size;

Clothes(String color,char size){

this.color=color;

this.size=size;

}

}

public class Shallowcopy {

public static void main(String[] args) {

Clothes[] c1={new Clothes("red",'L'),new Clothes("green",'M')};

Clothes[] c2=new Clothes[c1.length];

for(int i=0;i<c1.length;i++){

c1[i]=c1[i];

}

c1[0].color="yellow";

System.out.println(c2[0].color);

}

}

错误:Exception in thread "main" java.lang.NullPointerException
at cc.openhome.Shallowcopy.main
解决:百度解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象。检查发现 c1[i]=c1[i];书写错误,改为 c2[i]=c1[i];后运行正确

问题3

package cc.openhome;

public class CardApp {

public static void main(String[] args) {

CashCard[] cards={

new CashCard("A001",500,0),

new CashCard("A002",300,0),

new CashCard("A003",1000,1),

new CashCard("A004",2000,2),

new CashCard("A005",3000,3)

};

for(CashCard card:cards){

System.out.printf("(%s,%d,%d)%n",card.number,card.balance,card.bonus);

}

 

}

}错误: java: CardApp是公共的, 应在名为 CardApp.java 的文件中声明

解决:书本上有错误,应把CardApp改为与类名称完全吻合的名,改为CashApp

问题4

`package cc.openhome;

import java.util.Scanner;

public class CashApp {

public static void main(String[] args) {

CashCard[] cards={

new CashCard("A001",500,0),

new CashCard("A002",300,0),

new CashCard("A003",1000,1)

};

Scanner scanner=new Scanner(System.in);

for(CashCard card:cards){

System.out.printf("(%s,%d,%d)储值:",card.number,card.balance,card.bonus);

card.store(scanner.nextInt());

System.out.printf("明细(%s,%d,%d)%n",card.number,card.balance,card.bonus);

}

 

}

}`

错误:java: 找不到符号
符号: 方法 store(int)
位置: 类型为cc.openhome.CashCard
变量 card
解决:请教大神,得知这个程序代码调用了CashCard2,所以写的时候和书上的不能一样,组要根据自己的来调用,然后再把package cc.openhome;去掉,让两个函数在同一个工程文件下
import java.util.Scanner; public class CashApp { public static void main(String[] args) { CashCard2[] cards={ new CashCard2("A001",500,0), new CashCard2("A002",300,0), new CashCard2("A003",1000,1) }; Scanner scanner=new Scanner(System.in); for(CashCard2 card:cards){ System.out.printf("
(%s,%d,%d)储值:",card.number,card.balance,card.bonus); card.store(scanner.nextInt()); System.out.printf("明细(%s,%d,%d)%n",card.number,card.balance,card.bonus); } }}
再次编写运行正确

——20145329

65. 在数组的学习中看不懂这样的代码:

for(int score:scores){

System.out.printf("学生分数:%d %n",score);

}

再仔细阅读教材后发现,上述代码的意思可以解释为:

for(int i=0;i<scores.length;i++)

这个增强式for循环更加简便,他的思路是:上面的程序片段取得scores数组第一个元素,指定给score变量后执行循环体,依次类推,直到scores数组中所有元素都访问完为止。

——20145331

66. 教材学习中的问题和解决过程

Integer i1=100;

integer i2=100;

if(i1==i2){

System.out.println("i1==i2");

}

else{

System.out.println("i1!=i2");

}

在这段代码中i1i2都是100,最后的结果显示为"i1==i2"

Integer i1=200;

integer i2=200;

if(i1==i2){

System.out.println("i1==i2");

}

else{

System.out.println("i1!=i2");

}

而在这段代码中只是把i1i2都改为了200,可是结果与上一段截然不同,结果显示为"i1!=i2",这是为何?在这两段代码中,两个参考名称的两个对象虽然内含值相同,但是两个对象打包后,若iIntegerCache.lowIntegerCache.high之间,会从缓存中传回Integer实例,第一段代码中,因为i1i2的值相等,所以从缓存中传回的是同一个实例,但第二段代码中,iIntegerCache.lowIntegerCache.high之外,直接建立新的 Integer实例,新建立的实例虽然内含值相同,但并不是同一个实例。由于IntegerCache.low默认值是-128IntegerCache.high默认值是127,所以200在这个范围之外,所以i1i2不会参考到同一个Integer实例上,也就有了上面的效果。

——20145333

67. 代码调试中的问题和解决过程

这段代码中的int number = (int)(Math.random()10);,不懂什么意思。
解决过程:通过百度,这段代码中,Math是数学类,random()是Math类中的一个方法,random本身只产生(0~1)之间的小数,random()
10 意思是产生0~10之间的小数 int(random()*10)的意思是强制取整,把小数部分去掉只去整数部分,所以就变成了产生0~9之间的整数

——20144303

 

原文地址:https://www.cnblogs.com/xxy745214935/p/5389628.html