zoukankan      html  css  js  c++  java
  • Javaj基础知识runtime error

    遇到的java 运行时错误:

    NullPointerException空指针  ,简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。对数组操作中出现空指针,很多情况下是一些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的初始化混淆起来了。数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个元素都进行初始化(如果要调用的话)

    遇到一个错误:

    No enclosing instance of type Employee is accessible

    StacticBlock.java中定义了Employee 类和 Manager类。

    class Employee{
        public Employee (String aName,double aSalary){
            name= aName;
            salary=aSalary;
        }
        ...
    }
    
    class Manager extends Employee{
            
            public Manager(String aname,double asalary)
            {
                super(aname,asalary);
                this.bonus =0;
            }
        ...
    }

    在另外一个Emp.java中报错:No enclosing instance of type Employee is accessible

        Manager m = new Manager("sgs",203.2); //error
        m.setBonus(800);
        Employee e = new Employee("dingwei",8300);
        Employee f= new Employee("pangzi",8000);

    解决办法: 将Manager类改成:public static class Manager extends Employee{...}

    网上查了下,很多说到是静态方法调用动态方法了。

    关于静态方法和实例方法到区别:

    在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
    在hasStaticMethod.java中定义两个方法:
    public class hasStaticMethod {
    
        public static void callMe()
        {
            System.out.println("I'm a static method from hasStaticMethod.");
        }
        
        public void callAgain()
        {
            System.out.println("I'm not static method");
        }
    }

    在InvokeStaticMethod.java中调用两种方法时:

    public class InvokeStaticMethod {
    
        public static void main(String[] args){
            //静态方法可以直接调用,不用实例化
            hasStaticMethod.callMe();
            //实例方法,需要先实例化一个对象。
            hasStaticMethod  d = new hasStaticMethod();
            d.callAgain();
            
        }
    }
    public class staticMethod {
            private static int sa; //定义一个静态成员变量
            private int ia;  //定义一个实例成员变量
            
            //下面定义一个静态方法
            static void statMethod(){
             int i = 0;    //正确,可以有自己的局部变量sa = 10;   
            //正确,静态方法可以使用静态变量
            otherStat();  
            //正确,可以调用静态方法
            ia = 20;   //错误,不能使用实例变量
            insMethod();  //错误,不能调用实例方法
            }
            
            static void otherStat(){} 
            
            //下面定义一个实例方法 
            void  insMethod(){
                
            int i = 0;    //正确,可以有自己的局部变量
            sa = 15;    //正确,可以使用静态变量
            ia = 30;    //正确,可以使用实例变量
            statMethod();   //正确,可以调用静态方法
            
            }
    } 

    静态方法只能访问静态成员,实例方法可以访问静态和实例成员。
    之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象。同样,因为实例方法可以访问实例成员变量,如果允许静态方法调用实例方法,将间接地允许它使用实例成员变量,所以它也不能调用实例方法。基于同样的道理,静态方法中也不能使用关键字this。
  • 相关阅读:
    2014-写给明年现在的自己
    DDD 领域驱动设计-Value Object(值对象)如何使用 EF 进行正确映射
    DDD 领域驱动设计-在动手之前,先把你的脑袋清理干净
    醍醐灌顶:领域驱动设计实现之路
    拨乱反正:DDD 回归具体的业务场景,Domain Model 再再重新设计
    设计窘境:来自 Repository 的一丝线索,Domain Model 再重新设计
    No zuo no die:DDD 应对具体业务场景,Domain Model 重新设计
    拨开迷雾,找回自我:DDD 应对具体业务场景,Domain Model 到底如何设计?
    【记录】GitHub/TortoiseGit 修改邮箱/提交者
    死去活来,而不变质:Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?
  • 原文地址:https://www.cnblogs.com/happinessqi/p/3413203.html
Copyright © 2011-2022 走看看