给内部类对象数组属性赋值时报错:Exception in thread "main" java.lang.NullPointerException
前言
1255: 打怪升级(Java),写这个题目程序的时候,控制台提示如下错误:
Exception in thread "main" java.lang.NullPointerException
at oj1255.Main.input(Main.java:41)
at oj1255.Main.<init>(Main.java:24)
at oj1255.Main.main(Main.java:52)
然后我调试才发现,这个对象数组居然是null的,这我就不理解了,我明明写了new的……
于是就有了这篇博客。为了突出重点,就重新写了个类,因此直接看下面的即可,不用管前言。
参考博客
示例1
package error.inner;
// 外部类
public class Outer {
// 内部类
private class Inner {
public int x; // 属性
}
private Inner[] test; // 内部类对象数组
// 构造方法
public Outer() {
int i;
test = new Inner[2]; // 创建实例
for(i = 0; i < 2; i++) {
test[i].x = i; // 赋值
}
// 输出内部类属性值
for(i = 0; i < 2; i++) {
System.out.println(test[i].x);
}
}
public static void main(String[] args) {
new Outer();
}
}
乍一看,你可能会觉得这段代码没有任何问题,然而事实是在控制台丢一个Exception给你:
Exception in thread "main" java.lang.NullPointerException
at oj1255.Outer.<init>(Outer.java:18)
at oj1255.Outer.main(Outer.java:27)
报错在第18行test[i].x = i;,于是进入了Debug模式
从红色箭头那一行,我们看到test[0]是null的,到这里应该都明白了。
我们在第16行test = new Inner[2]的代码实际上只是申请的对象数组的大小,如下图所示:

堆内存里面并没有Inner的实例,因此我们需要加1行代码即可:
// 构造方法
public Outer() {
int i;
test = new Inner[2]; // 创建Inner数组
for(i = 0; i < 2; i++) {
test[i] = new Inner(); // 创建实例
test[i].x = i; // 赋值
}
// 输出内部类属性值
for(i = 0; i < 2; i++) {
System.out.println(test[i].x);
}
}
其他代码都不用改,这样一来,堆中就变成了了这样:
到这里在运行程序,就能正常输出想要的东西了:

小结
类的实例数组,每一个都需要单独创建。切记!切记!
给内部类对象数组属性赋值时报错:Exception in thread "main" java.lang.NullPointerException的更多相关文章
- java使用类数组 报错Exception in thread "main" java.lang.NullPointerException
源代码如下: Point[] points=new Point[n];//Point是一个类 for(int i=0;i<n;i++) { System.out.print("请输入x ...
- Spring Boot 启动报错 Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 37
使用命令 java -jar springBoot.jar 启动项目,结果报错如下: Exception at java.lang.String.substring(String.java:) at ...
- Idea运行时Scala报错Exception in thread "main" java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
一.情况描述 使用idea +scala+spark,运行程序代码如下: package cn.idcast.hello import org.apache.spark.rdd.RDD import ...
- Spring报错:Exception in thread "main" java.lang.IllegalArgumentException at org.springframework.asm.ClassReader.<init>(Unknown Source)
简单搭建了一个Spring Maven工程就报错: 看到网上说是JDK 7 和 Spring3.x :JDK编译级别设置成1.7,仍然没有得到解决,采用版本为 3.2.0.RELEASE <b ...
- 使用Grizzy+Jersey搭建一个RESTful框架()报错Exception in thread "main" java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;
报错的类涉及UriBuilder,我搜索类发现, 这个类存在于两个包中,我在baidu的时候,也有人提到是jar包冲突,我就删除了 这个依赖,问题解决了. 环境搭建过程请见地址https://blog ...
- springBoot报错Exception in thread "main" java.lang.NoClassDefFoundError: ch/qos/logback/classic/Level
解决办法: 如果使用的是阿里云 maven 镜像,在这会有找不到最新 Springboot 相关包的问题,请把加速镜像指向华为云: <mirror> <id>huaweiclo ...
- 创建Sqoop作业,报错Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONObject
WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P in ...
- 报错Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/...
首先我的jdk是11.05的 这个是由于: 这个是 由于缺少了javax.xml.bind,在jdk10.0.1中没有包含这个包,所以我自己去网上下载了jdk 8,然后把jdk10.0.1换成jdk ...
- spark使用idea向yarn提交报错:Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/jersey/api/client/config/ClientConfig
解决方法: 找到1.19版本放到spark的jars目录下
随机推荐
- 走进JavaWeb技术世界16:极简配置的SpringBoot
一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时 ...
- JSP(工作原理,组成部分,指令标签,动作标签,隐式对象)
目录 JSP JSP 什么是JSP JSP全名为Java Server Pages 中文名叫java服务器页面 它是在传统的网页HTML文件(.htm,.html)中插入Java程序段和JSP标记 后 ...
- macbook配置flutter环境变量
打开命令窗口,如果没有文件的,可以手动创建文件 code ~/.bash_profile 打开的文件内容如下,如果新增的空文件,肯定是空白的 如果将flutter存放到了应用中,可以如下操作,如果不是 ...
- 4.弹性网络( Elastic Net)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_21904665/article/details/52315642 ElasticNet 是一种 ...
- 配置 阿里云ECS Ubuntu 16.04 64bit 桌面环境
1. 步骤 安装软件 修改root权限 重启 2. 详情 1. 安装软件 创建脚本文件(例如:desktopSetting.sh),并输入以下内容: #!/bin/bash #更新软件库 apt-ge ...
- Linux | Vim使用
Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主 ...
- 如何确认oracle客户端中的TNSNAMES中的service_name
在我们安装oracle的客户端,或者PLSQL develop的时候,需要在oracle的安装目录下修改TNSNAME中配置你要连接的数据库的TNS参数.配置好了可以通过命令行使用tnsping命令测 ...
- Json序列化指定输出字段 忽略属性
DataContract 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务 ...
- 用户Ip地址和百度地图api接口获取用户地理位置(经纬度坐标,城市)
<?php //获取用户ip(外网ip 服务器上可以获取用户外网Ip 本机ip地址只能获取127.0.0.1) function getip(){ if(!empty($_SERVE ...
- linux ubuntu 如何解决warning: no newline at end of file?
今天写了一段代码, 是在Windows下编辑的, 保存后放在linux系统下编译. gcc和cc都产生以下的警告: a.h:1:2: warning: no newline at end of fil ...