在线工具 在线编程 在线白板 在线工具 在线编程 在线白板

java.lang.NullPointerException

定义了一个入口类entry和一个Insert类,insert类是用来将一个数字插入到已有数组中,然后升序排列输出。报错:
Exception in thread "main" java.lang.NullPointerException
at test2.Insert.<init>(Insert.java:11) //这一行是指向int m=a.length+1;的,如果我把m定义成一个常数就没错了。
at test2.Entry.main(Entry.java:7)// 这行是Insert m=new Insert(a,n);
怎么解决啊??

代码如下
public class Entry {
public static void main(String[] args) {
int a[]={12,3,5,25,10};
int n=9;
Insert m=new Insert(a,n);
m.print();
}
}

import java.util.*;
class Insert {
int[] a;
int n;//n为要插入的数
public Insert(int[] a,int n){
//public void setA(int[] a,int n) { //使用构造方法或者一般方法来获取a[]和n.
this.a = a;
this.n=n;
}
int m=a.length+1;
int[] b=new int[m];
private void in(){
int i;
Arrays.sort(a);
for(i=0;i<m-1;i++)
b[i]=a[i];
b[i]=this.n;
Arrays.sort(b);
}
public void print(){
this.in();
for(int i=0;i<b.length;i++)
System.out.print(b[i]+" ");
}

}
最新回答
灵魂◆被瓦解

2024-05-01 13:54:51

NullPointerException 意味空指针,发生这种情况是说对象为null,却调用该对象属性或者方法。
比如String s =null;
s.equals("aa"); 这种就报上述异常。
你代码中会出现异常是因为数组没有初始化变使用length属性,java中有8中基本数据类型
byte ,short,char,int,long,float,double,boolean
那么数组array自然是引用类型,也就是对象。
之所以出问题是因为你忽略了java执行的顺序,当你要使用某个类的时候,类加载器将类加载到java虚拟机中,这个类最先将static修饰的属性和方法初始化,因为他们的生命周期和类一样,俗称类方法和类属性, 而非static修饰的,比如你的Insert类中的int[] a;它属于实例变量,那么和实例共享。
你在new Insert()产生Insert实例时,类会先初始化所有实例属性,这时候你的int[] a默认是null,然后你又调用a.length,自然引发空指针了。
简易改变,关键代码:
public class Insert {
int[] a ;
int n;
int[] b;
int m;

public Insert(int[] a, int n) {
this.a = a;
this.n = n;
m = a.length + 1;
b = new int[m];
}

以下赋值放到构造方法里,这样就OK了.
m = a.length + 1;
b = new int[m];
北蒙岛的雨季

2024-05-01 04:55:07

当你在new insert对象的时候,此时会初始化Insert类中所有的属性,而此时你的a数组并没有赋值,所以在a。length的时候就出现空指针了,
把你的int m = a.length + 1;int[] b = new int[m];放到Insert构造函数里去!初始化数据是构造函数或者静态代码块做的事。
追问
谢谢啦~只能选一个满意答案,所以...
雨点躲日落

2024-05-01 01:27:31

首先你有一个编译错误,
你的a没有初始值,所以a.length会报错
然后你的m的值就没了
再难遇我

2024-05-01 16:21:52

首先找到发生异常的那行,然后寻找逐步向上找源头。如果没有必要查找源头,可以直接绕过它。譬如:

1,List<String>books=BooKDAO.findAll();
2,intsize=books.size();


如果第2行发生空指针异常了,知道books肯定为null了,这时查找BookDAO.的findAll方法,如果findAll()方法又调用了其他的方法,可以继续查下去。如果没有业务需要,可以直接写成:

List<String>books=BooKDAO.findAll();
intsize=0;
if(books!=null){
size=books.size();
}

或者

List<String>books=BooKDAO.findAll();
intsize=0;
try{
size=books.size();
}catch(NullpointerException){
size=0;或者不写或者打印错误
}

/iknow-pic.cdn.bcebos.com/8694a4c27d1ed21b27f786aba06eddc451da3f45"target="_blank"title="点击查看大图"class="ikqb_img_alink">/iknow-pic.cdn.bcebos.com/8694a4c27d1ed21b27f786aba06eddc451da3f45?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_600%2Ch_800%2Climit_1%2Fquality%2Cq_85%2Fformat%2Cf_auto"esrc="

https://iknow-pic.cdn.bcebos.com/8694a4c27d1ed21b27f786aba06eddc451da3f45
"/>

扩展资料

最重要的类是Object(它是类层次结构的根)和Class(它的实例表示正在运行的应用程序中的类)。把基本类型的值当成一个对象来表示通常很有必要。包装器类Boolean、Character、Integer、Long、Float和Double就是用于这个目的。

类Math提供了常用的数学函数,比如正弦、余弦和平方根。类似地,类String和StringBuffer提供了常用的字符串操作。

类ClassLoader、Process、Runtime、SecurityManager和System提供了管理类的动态加载、外部进程创建、主机环境查询(比如时间)和安全策略实施等“系统操作”。

类Throwable包含了可能由throw语句抛出的对象(§14.16)。Throwable的子类表示错误和异常。

参考资料:/baike.baidu.com/item/java.lang/5179788"target="_blank"title="java.lang-百度百科">java.lang-百度百科