java中数组是怎么作为函数参数进行传递的

时间:2022-05-14 21:28:00
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] dataList = {5,7,100,-2,0,10,121};
QuickSort qs = new QuickSort();
qs.quickSort(dataList, 0, 6);
}


这一段代码   运行时为什么会抛出空指针异常?··求解释

14 个解决方案

#1


请帖出你的完整代码。
QuickSort qs = new QuickSort();
qs.quickSort(dataList, 0, 6);

这里看不到,就不明白你的代码的意思

#2


public class QuickSort {

//private int dataList[] = {5,7,100,-2,0,10,121};
void quickSort(int dataList[],int left,int right){
if(left<right){
int pivotpos = partition(dataList,left,right);
quickSort(dataList,left,pivotpos - 1);
quickSort(dataList,pivotpos + 1,right);
}
for(int i =0; i <=dataList.length;i++){
System.out.println(dataList[i] + " ");
}
}

int partition(int dataList[],int low,int high){
int pivotpos = low;
int Vector[] = null;
for(int i = 0;i <= dataList.length;i++){
Vector[i] = dataList[i];
}
int pivot = Vector[low];
for(int i = low + 1;i <= high;i++){
if(Vector[i] < pivot){
pivotpos++;
if(pivotpos != i )  swap(Vector[pivotpos],Vector[i]);

}

}
Vector[low] = Vector[pivotpos];
Vector[pivotpos] = pivot;

return pivotpos;
}

void swap(int a,int b){
int x  = 0;
x = a;
a = b;
b = x;
}

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] dataList = {5,7,100,-2,0,10,121};
QuickSort qs = new QuickSort();
qs.quickSort(dataList, 0, 6);
}

}

#3


quickSort(dataList, 0, 6); 第三个参数为dataList中的元素位置,dataList.length=6,最后一个元素为dataList[5],即dataList.length -1 

#4


int pivotpos = low;
int Vector[] = null;
for (int i = 0; i <= dataList.length; i++) {
Vector[i] = dataList[i];
}

#5


引用 3 楼 magi1201 的回复:
quickSort(dataList, 0, 6); 第三个参数为dataList中的元素位置,dataList.length=6,最后一个元素为dataList[5],即dataList.length -1 
 不好意思,看错了,楼主贴一下你的具体的错误信息,帮助分析

#6


Vector[] 木有new

#7


Exception in thread "main" java.lang.NullPointerException
at org.demo.QuickSort.partition(QuickSort.java:21)
at org.demo.QuickSort.quickSort(QuickSort.java:8)
at org.demo.QuickSort.main(QuickSort.java:49)

Vector[i] = dataList[i];
int pivotpos = partition(dataList,left,right);
qs.quickSort(dataList, 0, 6);
这三句报错

#8


我给你修改过了。也指出了你的错误。注意你的for循环的 <= 与 < 的使用的情形。你这里的问题很严重啊,出现了2个错误。


package com.wanmei.test;

public class QuickSort {

// private int dataList[] = {5,7,100,-2,0,10,121};
void quickSort(int dataList[], int left, int right) {
if (left < right) {
int pivotpos = partition(dataList, left, right);
quickSort(dataList, left, pivotpos - 1);
quickSort(dataList, pivotpos + 1, right);
}
//for (int i = 0; i <= dataList.length; i++) {//这里不能是 <= 会造成数组的越界,应该是 <
for (int i = 0; i < dataList.length; i++) {
System.out.println(dataList[i] + " ");
}
}

int partition(int dataList[], int low, int high) {
int pivotpos = low;
//int Vector[] = null;//你这里给int数组赋予的是空值,当然在后面的调用的时候会出错了。
int vector[] = new int[dataList.length];;
//for (int i = 0; i <= dataList.length; i++) {//这里不能是 <= 会造成数组的越界,应该是 <
for (int i = 0; i < dataList.length; i++) {
vector[i] = dataList[i];
}
int pivot = vector[low];
for (int i = low + 1; i <= high; i++) {
if (vector[i] < pivot) {
pivotpos++;
if (pivotpos != i)
swap(vector[pivotpos], vector[i]);

}

}
vector[low] = vector[pivotpos];
vector[pivotpos] = pivot;

return pivotpos;
}

void swap(int a, int b) {
int x = 0;
x = a;
a = b;
b = x;
}

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] dataList = { 5, 7, 100, -2, 0, 10, 121 };
QuickSort qs = new QuickSort();
qs.quickSort(dataList, 0, 6);
}

}



#9


int Vector[] = new int[dataList.length];

#10


引用 7 楼 q358543781 的回复:
Exception in thread "main" java.lang.NullPointerException
at org.demo.QuickSort.partition(QuickSort.java:21)
at org.demo.QuickSort.quickSort(QuickSort.java:8)
at org.demo.QuickSort.main(QuickSort.java:49)

Vector[i] = dataList[i];
int pivotpos = partition(dataList,left,right);
qs.quickSort(dataList, 0, 6);
这三句报错



at org.demo.QuickSort.partition(QuickSort.java:21)
at org.demo.QuickSort.quickSort(QuickSort.java:8)
at org.demo.QuickSort.main(QuickSort.java:49)

这三行出错,楼主可以自己检查代码,打断点来跟踪,慢慢就学会调试了。

#11


引用 8 楼 develop_design_level 的回复:
我给你修改过了。也指出了你的错误。注意你的for循环的 <= 与 < 的使用的情形。你这里的问题很严重啊,出现了2个错误。


package com.wanmei.test;

public class QuickSort {

// private int dataList[] = {5,7,100,-2,0,10,121};
void quickSort(int dataList[], int left, int right) {
if (left < right) {
int pivotpos = partition(dataList, left, right);
quickSort(dataList, left, pivotpos - 1);
quickSort(dataList, pivotpos + 1, right);
}
//for (int i = 0; i <= dataList.length; i++) {//这里不能是 <= 会造成数组的越界,应该是 <
for (int i = 0; i < dataList.length; i++) {
System.out.println(dataList[i] + " ");
}
}

int partition(int dataList[], int low, int high) {
int pivotpos = low;
//int Vector[] = null;//你这里给int数组赋予的是空值,当然在后面的调用的时候会出错了。
int vector[] = new int[dataList.length];;
//for (int i = 0; i <= dataList.length; i++) {//这里不能是 <= 会造成数组的越界,应该是 <
for (int i = 0; i < dataList.length; i++) {
vector[i] = dataList[i];
}
int pivot = vector[low];
for (int i = low + 1; i <= high; i++) {
if (vector[i] < pivot) {
pivotpos++;
if (pivotpos != i)
swap(vector[pivotpos], vector[i]);

}

}
vector[low] = vector[pivotpos];
vector[pivotpos] = pivot;

return pivotpos;
}

void swap(int a, int b) {
int x = 0;
x = a;
a = b;
b = x;
}

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] dataList = { 5, 7, 100, -2, 0, 10, 121 };
QuickSort qs = new QuickSort();
qs.quickSort(dataList, 0, 6);
}

}



可是为什么没有排序啊··这是快速排序算法啊

#12


引用 11 楼 q358543781 的回复:
Quote: 引用 8 楼 develop_design_level 的回复:

我给你修改过了。也指出了你的错误。注意你的for循环的 <= 与 < 的使用的情形。你这里的问题很严重啊,出现了2个错误。


package com.wanmei.test;

public class QuickSort {

// private int dataList[] = {5,7,100,-2,0,10,121};
void quickSort(int dataList[], int left, int right) {
if (left < right) {
int pivotpos = partition(dataList, left, right);
quickSort(dataList, left, pivotpos - 1);
quickSort(dataList, pivotpos + 1, right);
}
//for (int i = 0; i <= dataList.length; i++) {//这里不能是 <= 会造成数组的越界,应该是 <
for (int i = 0; i < dataList.length; i++) {
System.out.println(dataList[i] + " ");
}
}

int partition(int dataList[], int low, int high) {
int pivotpos = low;
//int Vector[] = null;//你这里给int数组赋予的是空值,当然在后面的调用的时候会出错了。
int vector[] = new int[dataList.length];;
//for (int i = 0; i <= dataList.length; i++) {//这里不能是 <= 会造成数组的越界,应该是 <
for (int i = 0; i < dataList.length; i++) {
vector[i] = dataList[i];
}
int pivot = vector[low];
for (int i = low + 1; i <= high; i++) {
if (vector[i] < pivot) {
pivotpos++;
if (pivotpos != i)
swap(vector[pivotpos], vector[i]);

}

}
vector[low] = vector[pivotpos];
vector[pivotpos] = pivot;

return pivotpos;
}

void swap(int a, int b) {
int x = 0;
x = a;
a = b;
b = x;
}

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] dataList = { 5, 7, 100, -2, 0, 10, 121 };
QuickSort qs = new QuickSort();
qs.quickSort(dataList, 0, 6);
}

}



可是为什么没有排序啊··这是快速排序算法啊


你的问题是:为什么会报错,而不是“这个算法”该如何实现。我当然没有修改你的算法了。为什么没有排序,应该自己检查一下代码的逻辑,看看自己什么地方出错了。可以实现用伪代码把逻辑写出来,建立模型,分析一下,然后再逻辑正确的前提下,在写你的java代码。中间如果代码出错,你应该学会用IDE的debug工具,进行代码分析。

#13


下面是Java的JDK自带的排序。

public static void main(String[] args) {

int[] dataList = { 5, 7, 100, -2, 0, 10, 121 };

Arrays.sort(dataList, 0, 6);
for (int i : dataList) {
System.out.println(i);
}

}



不清楚你为什么要自己写一套排序的算法。为了练手?可以的。不过,你可以先参考人家JDK给出的API,借鉴人家的经验。或者你的排序有什么特殊的要求?也需要自己来写。那么就先思考整个完整的排序算法,写在纸上,或者画出排序的流程图。然后再去编码。

#14


该回复于2014-08-22 14:03:09被管理员删除

#1


请帖出你的完整代码。
QuickSort qs = new QuickSort();
qs.quickSort(dataList, 0, 6);

这里看不到,就不明白你的代码的意思

#2


public class QuickSort {

//private int dataList[] = {5,7,100,-2,0,10,121};
void quickSort(int dataList[],int left,int right){
if(left<right){
int pivotpos = partition(dataList,left,right);
quickSort(dataList,left,pivotpos - 1);
quickSort(dataList,pivotpos + 1,right);
}
for(int i =0; i <=dataList.length;i++){
System.out.println(dataList[i] + " ");
}
}

int partition(int dataList[],int low,int high){
int pivotpos = low;
int Vector[] = null;
for(int i = 0;i <= dataList.length;i++){
Vector[i] = dataList[i];
}
int pivot = Vector[low];
for(int i = low + 1;i <= high;i++){
if(Vector[i] < pivot){
pivotpos++;
if(pivotpos != i )  swap(Vector[pivotpos],Vector[i]);

}

}
Vector[low] = Vector[pivotpos];
Vector[pivotpos] = pivot;

return pivotpos;
}

void swap(int a,int b){
int x  = 0;
x = a;
a = b;
b = x;
}

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] dataList = {5,7,100,-2,0,10,121};
QuickSort qs = new QuickSort();
qs.quickSort(dataList, 0, 6);
}

}

#3


quickSort(dataList, 0, 6); 第三个参数为dataList中的元素位置,dataList.length=6,最后一个元素为dataList[5],即dataList.length -1 

#4


int pivotpos = low;
int Vector[] = null;
for (int i = 0; i <= dataList.length; i++) {
Vector[i] = dataList[i];
}

#5


引用 3 楼 magi1201 的回复:
quickSort(dataList, 0, 6); 第三个参数为dataList中的元素位置,dataList.length=6,最后一个元素为dataList[5],即dataList.length -1 
 不好意思,看错了,楼主贴一下你的具体的错误信息,帮助分析

#6


Vector[] 木有new

#7


Exception in thread "main" java.lang.NullPointerException
at org.demo.QuickSort.partition(QuickSort.java:21)
at org.demo.QuickSort.quickSort(QuickSort.java:8)
at org.demo.QuickSort.main(QuickSort.java:49)

Vector[i] = dataList[i];
int pivotpos = partition(dataList,left,right);
qs.quickSort(dataList, 0, 6);
这三句报错

#8


我给你修改过了。也指出了你的错误。注意你的for循环的 <= 与 < 的使用的情形。你这里的问题很严重啊,出现了2个错误。


package com.wanmei.test;

public class QuickSort {

// private int dataList[] = {5,7,100,-2,0,10,121};
void quickSort(int dataList[], int left, int right) {
if (left < right) {
int pivotpos = partition(dataList, left, right);
quickSort(dataList, left, pivotpos - 1);
quickSort(dataList, pivotpos + 1, right);
}
//for (int i = 0; i <= dataList.length; i++) {//这里不能是 <= 会造成数组的越界,应该是 <
for (int i = 0; i < dataList.length; i++) {
System.out.println(dataList[i] + " ");
}
}

int partition(int dataList[], int low, int high) {
int pivotpos = low;
//int Vector[] = null;//你这里给int数组赋予的是空值,当然在后面的调用的时候会出错了。
int vector[] = new int[dataList.length];;
//for (int i = 0; i <= dataList.length; i++) {//这里不能是 <= 会造成数组的越界,应该是 <
for (int i = 0; i < dataList.length; i++) {
vector[i] = dataList[i];
}
int pivot = vector[low];
for (int i = low + 1; i <= high; i++) {
if (vector[i] < pivot) {
pivotpos++;
if (pivotpos != i)
swap(vector[pivotpos], vector[i]);

}

}
vector[low] = vector[pivotpos];
vector[pivotpos] = pivot;

return pivotpos;
}

void swap(int a, int b) {
int x = 0;
x = a;
a = b;
b = x;
}

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] dataList = { 5, 7, 100, -2, 0, 10, 121 };
QuickSort qs = new QuickSort();
qs.quickSort(dataList, 0, 6);
}

}



#9


int Vector[] = new int[dataList.length];

#10


引用 7 楼 q358543781 的回复:
Exception in thread "main" java.lang.NullPointerException
at org.demo.QuickSort.partition(QuickSort.java:21)
at org.demo.QuickSort.quickSort(QuickSort.java:8)
at org.demo.QuickSort.main(QuickSort.java:49)

Vector[i] = dataList[i];
int pivotpos = partition(dataList,left,right);
qs.quickSort(dataList, 0, 6);
这三句报错



at org.demo.QuickSort.partition(QuickSort.java:21)
at org.demo.QuickSort.quickSort(QuickSort.java:8)
at org.demo.QuickSort.main(QuickSort.java:49)

这三行出错,楼主可以自己检查代码,打断点来跟踪,慢慢就学会调试了。

#11


引用 8 楼 develop_design_level 的回复:
我给你修改过了。也指出了你的错误。注意你的for循环的 <= 与 < 的使用的情形。你这里的问题很严重啊,出现了2个错误。


package com.wanmei.test;

public class QuickSort {

// private int dataList[] = {5,7,100,-2,0,10,121};
void quickSort(int dataList[], int left, int right) {
if (left < right) {
int pivotpos = partition(dataList, left, right);
quickSort(dataList, left, pivotpos - 1);
quickSort(dataList, pivotpos + 1, right);
}
//for (int i = 0; i <= dataList.length; i++) {//这里不能是 <= 会造成数组的越界,应该是 <
for (int i = 0; i < dataList.length; i++) {
System.out.println(dataList[i] + " ");
}
}

int partition(int dataList[], int low, int high) {
int pivotpos = low;
//int Vector[] = null;//你这里给int数组赋予的是空值,当然在后面的调用的时候会出错了。
int vector[] = new int[dataList.length];;
//for (int i = 0; i <= dataList.length; i++) {//这里不能是 <= 会造成数组的越界,应该是 <
for (int i = 0; i < dataList.length; i++) {
vector[i] = dataList[i];
}
int pivot = vector[low];
for (int i = low + 1; i <= high; i++) {
if (vector[i] < pivot) {
pivotpos++;
if (pivotpos != i)
swap(vector[pivotpos], vector[i]);

}

}
vector[low] = vector[pivotpos];
vector[pivotpos] = pivot;

return pivotpos;
}

void swap(int a, int b) {
int x = 0;
x = a;
a = b;
b = x;
}

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] dataList = { 5, 7, 100, -2, 0, 10, 121 };
QuickSort qs = new QuickSort();
qs.quickSort(dataList, 0, 6);
}

}



可是为什么没有排序啊··这是快速排序算法啊

#12


引用 11 楼 q358543781 的回复:
Quote: 引用 8 楼 develop_design_level 的回复:

我给你修改过了。也指出了你的错误。注意你的for循环的 <= 与 < 的使用的情形。你这里的问题很严重啊,出现了2个错误。


package com.wanmei.test;

public class QuickSort {

// private int dataList[] = {5,7,100,-2,0,10,121};
void quickSort(int dataList[], int left, int right) {
if (left < right) {
int pivotpos = partition(dataList, left, right);
quickSort(dataList, left, pivotpos - 1);
quickSort(dataList, pivotpos + 1, right);
}
//for (int i = 0; i <= dataList.length; i++) {//这里不能是 <= 会造成数组的越界,应该是 <
for (int i = 0; i < dataList.length; i++) {
System.out.println(dataList[i] + " ");
}
}

int partition(int dataList[], int low, int high) {
int pivotpos = low;
//int Vector[] = null;//你这里给int数组赋予的是空值,当然在后面的调用的时候会出错了。
int vector[] = new int[dataList.length];;
//for (int i = 0; i <= dataList.length; i++) {//这里不能是 <= 会造成数组的越界,应该是 <
for (int i = 0; i < dataList.length; i++) {
vector[i] = dataList[i];
}
int pivot = vector[low];
for (int i = low + 1; i <= high; i++) {
if (vector[i] < pivot) {
pivotpos++;
if (pivotpos != i)
swap(vector[pivotpos], vector[i]);

}

}
vector[low] = vector[pivotpos];
vector[pivotpos] = pivot;

return pivotpos;
}

void swap(int a, int b) {
int x = 0;
x = a;
a = b;
b = x;
}

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] dataList = { 5, 7, 100, -2, 0, 10, 121 };
QuickSort qs = new QuickSort();
qs.quickSort(dataList, 0, 6);
}

}



可是为什么没有排序啊··这是快速排序算法啊


你的问题是:为什么会报错,而不是“这个算法”该如何实现。我当然没有修改你的算法了。为什么没有排序,应该自己检查一下代码的逻辑,看看自己什么地方出错了。可以实现用伪代码把逻辑写出来,建立模型,分析一下,然后再逻辑正确的前提下,在写你的java代码。中间如果代码出错,你应该学会用IDE的debug工具,进行代码分析。

#13


下面是Java的JDK自带的排序。

public static void main(String[] args) {

int[] dataList = { 5, 7, 100, -2, 0, 10, 121 };

Arrays.sort(dataList, 0, 6);
for (int i : dataList) {
System.out.println(i);
}

}



不清楚你为什么要自己写一套排序的算法。为了练手?可以的。不过,你可以先参考人家JDK给出的API,借鉴人家的经验。或者你的排序有什么特殊的要求?也需要自己来写。那么就先思考整个完整的排序算法,写在纸上,或者画出排序的流程图。然后再去编码。

#14


该回复于2014-08-22 14:03:09被管理员删除