解决Java变异出现错误No enclosing instance of type XXX is accessible

目录
  • 一、错误代码和错误现象
  • 二、如何解决这些错误
    • 1、可以不使用内部类
    • 2、可以使用静态内部类
    • 3、使用非静态内部类时,使用外部类的实例进行调用

一、错误代码和错误现象

先记录下问题现象,写java代码时遇到下面的编译错误。

No enclosing instance of type FileTree is accessible. Must qualify the
allocation with an enclosing instance of type FileTree (e.g. x.new A()
where x is an instance of FileTree).

代码如下:

import java.util.Arrays;
import java.util.LinkedHashMap;

public class FileTree {
 class Node {
  String name;

  public Node(String name) {
   super();
   this.name = name;
  }

  LinkedHashMap<String, Node> map = new LinkedHashMap<String, Node>();
 }

 public static void outputThreeFormat(String[] in) {
  Arrays.sort(in);
  Node root = new Node("/");

 }

 public static void main(String[] args) {
  String[] in = { "usr/local/lib64", "GAMES",
    "usr/DRIVERS", "home", "var/log/" };
  outputThreeFormat(in);

 }

}

错误截图如下:

二、如何解决这些错误

错误的含义是,没有可以访问的外部实例enclosing instance。必须分配一个合适的外部类FileTree的实例(如x.new A(),x必须是FileTree的实例。)

结合出错的代码,很容易知道根源是什么:

  • class Node是非静态内部类
  • public static void outputThreeFormat(String[] in)是静态方法
  • 静态方法是不能直接访问非静态类的。

1、可以不使用内部类

可以把class Node作为外部类定义,这样在FileTree类中不管是静态还是非静态方法都可以直接new Node初始化个节点。

import java.util.Arrays;
import java.util.LinkedHashMap;

class Node {
 String name;

 public Node(String name) {
  super();
  this.name = name;
 }

 LinkedHashMap<String, Node> map = new LinkedHashMap<String, Node>();
}

public class FileTree {

 public static void outputThreeFormat(String[] in) {
  Arrays.sort(in);
  Node root = new Node("/");

 }

 public static void main(String[] args) {
  String[] in = { "usr/local/lib64", "GAMES", "usr/DRIVERS", "home", "var/log/" };
  outputThreeFormat(in);

 }

}

2、可以使用静态内部类

可以把class Node作为静态内部类定义,即static class Node

import java.util.Arrays;
import java.util.LinkedHashMap;

public class FileTree {
 static class Node {
  String name;

  public Node(String name) {
   super();
   this.name = name;
  }

  LinkedHashMap<String, Node> map = new LinkedHashMap<String, Node>();
 }

 public static void outputThreeFormat(String[] in) {
  Arrays.sort(in);
  Node root = new Node("/");

 }

 public static void main(String[] args) {
  String[] in = { "usr/local/lib64", "GAMES",
    "usr/DRIVERS", "home", "var/log/" };
  outputThreeFormat(in);

 }

}

3、使用非静态内部类时,使用外部类的实例进行调用

如下所示:

import java.util.Arrays;
import java.util.LinkedHashMap;

public class FileTree {
 class Node {
  String name;

  public Node(String name) {
   super();
   this.name = name;
  }

  LinkedHashMap<String, Node> map = new LinkedHashMap<String, Node>();
 }

 public static void outputThreeFormat(String[] in) {
  Arrays.sort(in);
  FileTree ft=new FileTree();
  Node root = ft.new Node("/");

 }

 public static void main(String[] args) {
  String[] in = { "usr/local/lib64", "GAMES",
    "usr/DRIVERS", "home", "var/log/" };
  outputThreeFormat(in);

 }

}

到此这篇关于解决Java变异出现错误No enclosing instance of type XXX is accessible的文章就介绍到这了,更多相关解决Java错误No enclosing instance of type XXX is accessible内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解决java调用dll报Unable to load library错误的问题

    如下: 1.确保路径下有该dll文件 2.dll和jdk必须确保同样是64位或者32位. 3.地址url中不能出现"/",必须是"\". 4.路径一定要对. 5.如果有同样的文件名出现,要在路径后面加上 ".dll",比如:System.getProperty("user.dir")+"\library"+"\PlayCtrl.dll" 补充知识:Java语言调用第三方dll文件的使用方

  • Java之SpringCloud Eurka注册错误解决方案

    学习SpringCloud时,在Eurka中注册时出现的错误: Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2019-10-04 11:15:19.703 ERROR 34860 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : ***************

  • Java开发人员最常犯的10个错误

    这个列表总结了10个Java开发人员最常犯的错误. Array转ArrayList 当需要把Array转成ArrayList的时候,开发人员经常这样做: List<String> list = Arrays.asList(arr); Arrays.asList()会返回一个ArrayList,但是要特别注意,这个ArrayList是Arrays类的静态内部类,并不是java.util.ArrayList类.java.util.Arrays.ArrayList类实现了set(), get(),c

  • JAVA中StackOverflowError错误的解决

    StackOverflowError 原因 根据名字的意思可以大致知道它是跟函数栈有关的错误,就是函数栈调用太深了,可能是代码中有了循环调用方法而无法退出的情况.而像while这样的死循环,不会报错,程序会一直执行下去,占用内存. 原理 StackOverflowError 是一个java中常出现的错误:在jvm运行时的数据区域中有一个java虚拟机栈,当执行java方法时会进行压栈弹栈的操作.在栈中会保存局部变量,操作数栈,方法出口等等.jvm规定了栈的最大深度,当执行时栈的深度大于了规定的深

  • Java String index out of range:100错误解决方案详解

    问题出错情况:字符串截取长度,没有那么长的长度所以截取失败. 在这里进行debug之后可以看到,异常在substring中: 也就是判断字符串的时候报错:具体原因就是string字符串indexof的值本身只有5,然后在这里去取其第100 个字符作为截止,因此就会报这个错: 知识点:主要是堆String概念不清.下面针对字符串相关概念做一个简介. 针对上述问题解决办法: 到此这篇关于Java String index out of range:100错误解决方案详解的文章就介绍到这了,更多相关J

  • 解决Java变异出现错误No enclosing instance of type XXX is accessible

    目录 一.错误代码和错误现象 二.如何解决这些错误 1.可以不使用内部类 2.可以使用静态内部类 3.使用非静态内部类时,使用外部类的实例进行调用 一.错误代码和错误现象 先记录下问题现象,写java代码时遇到下面的编译错误. No enclosing instance of type FileTree is accessible. Must qualify the allocation with an enclosing instance of type FileTree (e.g. x.ne

  • Java解决No enclosing instance of type PrintListFromTailToHead is accessible问题的两种方案

    今天在编译Java程序时遇到如下问题: No enclosing instance of type PrintListFromTailToHead is accessible. Must qualify the allocation with an enclosing instance of type PrintListFromTailToHead (e.g. x.new A() where x is an instance of PrintListFromTailToHead). 源代码为:

  • 完美解决java.lang.OutOfMemoryError处理错误的问题

    原因: 常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码中存在死循环或循环产生过多重复的对象实体: 4.使用的第三方软件中的BUG: 5.启动参数内存值设定的过小: 常见错误提示: 1.tomcat:java.lang.OutOfMemoryError: PermGen space 2.tomcat:java.lang.OutOfMemoryError: Java heap space 3

  • java.lang.OutOfMemoryError 错误整理及解决办法

    java.lang.OutOfMemoryError处理错误 java.lang.OutOfMemoryError异常解决方法 原因: 常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码中存在死循环或循环产生过多重复的对象实体: 4.使用的第三方软件中的BUG: 5.启动参数内存值设定的过小: 常见错误提示: 1.tomcat:java.lang.OutOfMemoryError: Perm

  • Hadoop运行时遇到java.io.FileNotFoundException错误的解决方法

    报错信息: java.lang.Exception: org.apache.hadoop.mapreduce.task.reduce.Shuffle$ShuffleError: error in shuffle in localfetcher#1 at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462) at org.apache.hadoop.mapred.LocalJobRunner$Jo

  • 解决 java.lang.NoSuchMethodError的错误

    解决 java.lang.NoSuchMethodError的错误 1 原因 在项目依赖比较复杂或者 Java 运行的环境有问题时,或者同一类型的 jar 包有不同版本存在,都可能触发该错误.本质上说是 JVM 找不到某个类的特定方法,也就是说 JVM 加载了错误版本的类.说白了,就是 JVM 找不到真正想要调用的方法啦!出现该错误的情形主要有以下两个种: 导入了不匹配的包版本: 开发环境和运行环境不一致. 2 解决方法 查看"External Libraries",看报错的方法到底存

  • java.lang.NoClassDefFoundError错误解决办法

    java.lang.NoClassDefFoundError错误解决办法 前言 在日常Java开发中,我们经常碰到java.lang.NoClassDefFoundError这样的错误,需要花费很多时间去找错误的原因,具体是哪个类不见了?类明明还在,为什么找不到?而且我们很容易把java.lang.NoClassDefFoundError和java.lang.ClassNotfoundException这两个错误搞混,事实上这两个错误是完全不同的.我们往往花费时间去不断尝试一些其他的方法去解决这

  • Eclipse 开发java 出现Failed to create the Java Virtual Machine错误解决办法

    Eclipse 开发java 出现Failed to create the Java Virtual Machine错误解决办法 一直用Eclipse开发Java,突然有这么一天,无法启动了,splash窗口显示"Failed to create the Java Virtual Machine" 修改eclipse.ini配置文件,找到下面的片段: --launcher.XXMaxPermSize 256M -showsplash org.eclipse.platform --lau

  • 解决java编译错误( 程序包javax.servlet不存在javax.servlet.*)

    解决java编译错误( 程序包javax.servlet不存在javax.servlet.*) 编译:javac Servlet.java 出现 软件包 javax.servlet 不存在 软件包javax.servlet.http 不存在 等错误 由于servlet和JSP不是Java平台JavaSE(标准版)的一部分,而是Java EE(企业版)的一部分,因此,必须告知编译器servlet的位置. 解决"软件包 javax.servlet不存在"错误的方法: 1. 搜索servle

  • Java java.lang.ExceptionInInitializerError 错误如何解决

     Java java.lang.ExceptionInInitializerError 错误如何解决 引起 Java.lang.ExceptionInInitializerError 错误的原因是:在类的初始化时,出错.也就是说,在加载类时,执行static的属性.方法块时,出错了. 比如 public class AA { private static AA aa = new AA(); private AA(){//构造方法 init(); } public void init(){ ...

随机推荐