从错误Cannot make……from the type Random的来讨论解决错误思想和方式

9 篇文章 0 订阅
写在前面

错误是我们在写程序中永远避免不了的东西,因为人的逻辑和计算机的逻辑是存在质的区别的。写在前面的这段话实际上是在一次次遇到错误、发现错误、思考错误、修改错误后有感而发的。
这也是我,一位刚刚入门Java的小菜鸟写的第一篇所谓“技术”的博客。我就拿最新碰到的小问题来谈谈面对编程过程中遇到错误时的解决方法或者说处理思想。

开门见山
import java.util.Random;

class Cat{
    private boolean mousehave = false;
    ......
    public void findFood(){
        System.out.println("正在抓老鼠……");
        mousehave = Random.nextBoolean();
        if(mousehave == true){
            System.out.println("抓到老鼠了!");
        }
    }   
}

这是对问题代码片段的摘要,代码大致意思相信对Java不陌生的朋友没有什么理解困难。这里我们谈论它的错误:对于大神来说,或者编程经验多的人来讲。这里的错误似乎已经不言而喻。但是对于初入Java世界的新手来说,如果没有系统的错误提示此处大多情况下会被认为是逻辑正确的。那么实际上IDE已经在编译前或者编译器会报出如下错误:

Cannot make a static reference to the non-static method nextBoolean() from the type Random

见字先知意,这句话的大致意思就是系统自带的Random类里的非静态成员方法nextBoolean()无法作为静态引用。乍一看一脸蒙逼。这里我们首先不去分析这个问题的本身,当我们遇到类似问题的时候,相信大部分人的心理只用一个字就能形容:‘烦’。没错,错误是谁都不想看到的,但是错误也是我们编程过程中无法避免的。与其每每遇到时的抱怨,我觉得以作为高素质的程序员为目标的我们,摆正心态才是解决问题的关键。首先要觉得这就是一个家常便饭,或者说是无聊编程中突发的挑战。兴致是解决问题的动力之一,任何的问题都是我们自身的漏洞,只有不断的修正代码的错误,才能让我们不断去贴近计算机逻辑,写出更加健壮健康的代码。

号脉

前面说了这么多,我们从这个问题出发,首先我们遇到问题时的第一反应是思考,分析错误点和错误原因,那么这段代码的错误在哪儿呢?很明显,Random.nextBoolean();这里出了问题。解决问题的途径也很多:查阅工具书、搜索引擎、论坛求助…..但是我想要说的是对于问题我们千万不能产生条件性的解决依赖。当我们分析问题过程中存在自己的知识缺陷和逻辑死角的时候我们再借以外力,这对于解决问题能力是一种莫大的锻炼。
在此处我们已经知道了Random是一个系统自定义的类,那么我们在类中调用系统自带类的成员方法时便会有先入为主的思想:既然系统自定义,那么拿来直接用。哈,那你和我一样上了这个陷阱的当。静态的类定义在系统运行时首先会加载到内存的方法区,然后Cat的对象才会在运行过程中在堆里开辟。这样一来非静态方法Random.nextBoolean()是无法返回一个静态值然后赋值给mousehave的。系统认为在赋值语句前Random.nextBoolean()是没有具体载体(对象)来初始化一个随机变量,这就是这个错误的意思;
那么其实解决起来很简单:在赋值前把Random类实例化,实例化的Random对象会包含一个方法来返回一个随机数,我们直接看代码说话吧:

        Random random = new Random();
        mousehave = random.nextBoolean();

这样一来这个问题就可以解决了。
。。。
。。

但是这样就是完美的解决了么?对于问题我们应该深入和透彻的分析,所以我们应该有多方法和最优化的思维习惯,如何优化代码、还有更效率的解法么、还有更直观简洁的解法么…….
这里提到匿名对象就是在这基础上更加优化的解决办法:
匿名对象直观上来讲即用即定义,没有多余的对象名减少了代码的复杂度。更深的是它即用即回收,对于性能来说是一种优化。在编程初期虽然感觉不到这种差异,但随着程序的愈发庞大,对内存有效及时的清理回收是提高优化性能的不二之选。
在匿名对象下代码又回到了极简的一行:

mousehave = new Random().nextBoolean();

做到这儿,我个人觉得才算真正解决了这个问题,我们对问题的解决不仅仅在于解决问题本事,更多的是我们从解决问题中收获了什么,我们是否能将问题以最优化的方式去解决才是编程过程中不断提升自己的关键。

后言

罗利巴索的对一个小问题的分析其实醉翁之意不在酒,我想通过这篇小博客小问题来和大家讨论我们面对问题时应该报以什么态度,存有什么思想,拿有什么方法,寻求什么途径甚至追求之什么解决程度。这远比问题本事更加有价值和意义!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值