public class Demo3_3 { public static void main(String[] args) { // TODO Auto-generated method stub int array[]={1,4,5,6}; System.out.println("MinOfArr="+FindMin(array)); } public static int FindMin(int[] array) { int MinOfArray=array[0]; for(int j=0;j<array.length;j++) { if(array[j]<MinOfArray) MinOfArray=array[j]; } return MinOfArray; }} 我运行了一把,没问题啊
楼主,你把main函数的详细代码贴出来。或者自己和我说的情况比对一下。下面是我按照你的代码的三种声明数组的方式。package test; public class testx { public static void main(String[] args) { // int[] arr = {1,2,3} ; 这种设置了值的情况是没有问题的。 // int[] arr = new int[1]; 这种初期化了大小的也是没有问题的。 int[] arr = null;//这种就会抛出NullPointException System.out.println("MinOfArr="+FindMin(arr)); } public static int FindMin(int[] array) { int MinOfArray=array[0]; for(int j=0;j<array.length;j++) { if(array[j]<MinOfArray) MinOfArray=array[j]; } return MinOfArray; } }
话说方法执行完毕后,栈内的局部变量就会消失,为什么还能返回给主调函数,在C或C++时,我总是十分注意不要返回局部变量,难道在Java中没有这个问题吗?千万不要用C++的思想来看Java,很多C++不能做的Java却可以,我理解你说的不返回局部变量,因为在C++里面函数结束之后局部变量就无法使用了,但Java不存在这个问题。比如,可以这么写: public int getSQLCount(String sql) throws Exception { conn = DBManager.getConnection(); QueryRunner qr = new QueryRunner(); Long countValue = (Long) qr.query(conn, sql, new ScalarHandler(1)); int count = countValue.intValue(); DBManager.closeConnection(); return count; }
话说方法执行完毕后,栈内的局部变量就会消失,为什么还能返回给主调函数,在C或C++时,我总是十分注意不要返回局部变量,难道在Java中没有这个问题吗?千万不要用C++的思想来看Java,很多C++不能做的Java却可以,我理解你说的不返回局部变量,因为在C++里面函数结束之后局部变量就无法使用了,但Java不存在这个问题。比如,可以这么写: public int getSQLCount(String sql) throws Exception { conn = DBManager.getConnection(); QueryRunner qr = new QueryRunner(); Long countValue = (Long) qr.query(conn, sql, new ScalarHandler(1)); int count = countValue.intValue(); DBManager.closeConnection(); return count; }
受教了,谢谢
话说方法执行完毕后,栈内的局部变量就会消失,为什么还能返回给主调函数,在C或C++时,我总是十分注意不要返回局部变量,难道在Java中没有这个问题吗?千万不要用C++的思想来看Java,很多C++不能做的Java却可以,我理解你说的不返回局部变量,因为在C++里面函数结束之后局部变量就无法使用了,但Java不存在这个问题。比如,可以这么写: public int getSQLCount(String sql) throws Exception { conn = DBManager.getConnection(); QueryRunner qr = new QueryRunner(); Long countValue = (Long) qr.query(conn, sql, new ScalarHandler(1)); int count = countValue.intValue(); DBManager.closeConnection(); return count; }
这个有问题吗??
这个有问题吗??
你传入的arrnew没?初始化吗必然是这里错了
int MinOfArray=array[0];
for(int j=0;j<array.length;j++) {
if(array[j]<MinOfArray)
MinOfArray=array[j];
}
return MinOfArray;
}
这个方法改一下public static int FindMin(int[] array) {
/* 不管你对调用方多么有信心,你都应该对传进来的参数做检查,应该对方法的执行做保证。抛出异常可以在出现问题时更容易定位,另外,如果你的array里肯定都是正整数,也可以通过return -1;的方式来告诉调用方这个方法执行出现了问题。 */
if (array == null || array.length == 0) {
throw new IllegalArgumentException("invalid argument array: " + array);
}
/* 这是前面做了array.length肯定大于0的检查了,你可以让minOfArray = array[0],但更好的方式是先赋一个极大值,这样即使没有检查,也不会出现数组越界。 */
int minOfArray = Integer.MAX_VALUE; //局部变量通常首字母小写
for(int j=0;j<array.length;j++) {
if(array[j]<minOfArray)
minOfArray=array[j];
}
return minOfArray;
}
{
public static void main(String [] args)
{
System.out.println(printx());
}
public static int printx()
{
int i=1;
return i;
}
}我这样运行的,结果正确,除非你的传的数组 arr 有问题。程序本深身是没有问题的
{
public static void main(String [] args)
{
System.out.println(printx());
int[] my = {1,2,3,4};
System.out.println("min" + FindMin(my));
} public static int printx()
{
int i=1;
return i;
} public static int FindMin(int[] array)
{
int MinOfArray=array[0];
for(int j=0;j<array.length;j++)
{
if(array[j]<MinOfArray)
MinOfArray=array[j]; // System.out.println(j);
// System.out.println(array[j]);
}
return MinOfArray;
}
}
这个有问题吗??
你传入的arrnew没?初始化吗必然是这里错了
看看你的arr咯?
// TODO Auto-generated method stub
int array[]={1,4,5,6};
System.out.println("MinOfArr="+FindMin(array));
}
public static int FindMin(int[] array)
{
int MinOfArray=array[0];
for(int j=0;j<array.length;j++)
{
if(array[j]<MinOfArray)
MinOfArray=array[j];
}
return MinOfArray;
}}
我运行了一把,没问题啊
public static void main(String[] args) { // int[] arr = {1,2,3} ; 这种设置了值的情况是没有问题的。
// int[] arr = new int[1]; 这种初期化了大小的也是没有问题的。
int[] arr = null;//这种就会抛出NullPointException
System.out.println("MinOfArr="+FindMin(arr));
}
public static int FindMin(int[] array)
{
int MinOfArray=array[0];
for(int j=0;j<array.length;j++)
{
if(array[j]<MinOfArray)
MinOfArray=array[j];
}
return MinOfArray;
}
}
这个有问题吗??
你传入的arrnew没?初始化吗必然是这里错了
这个必然初始化了!
这个有问题吗??
你传入的arrnew没?初始化吗必然是这里错了
这个必然初始化了!
你把main贴出来,真相自知。
public int getSQLCount(String sql) throws Exception {
conn = DBManager.getConnection();
QueryRunner qr = new QueryRunner();
Long countValue = (Long) qr.query(conn, sql, new ScalarHandler(1));
int count = countValue.intValue();
DBManager.closeConnection();
return count;
}
public int getSQLCount(String sql) throws Exception {
conn = DBManager.getConnection();
QueryRunner qr = new QueryRunner();
Long countValue = (Long) qr.query(conn, sql, new ScalarHandler(1));
int count = countValue.intValue();
DBManager.closeConnection();
return count;
}
受教了,谢谢
public int getSQLCount(String sql) throws Exception {
conn = DBManager.getConnection();
QueryRunner qr = new QueryRunner();
Long countValue = (Long) qr.query(conn, sql, new ScalarHandler(1));
int count = countValue.intValue();
DBManager.closeConnection();
return count;
}
受教了,谢谢请注意,C中从来没说不要把局部变量返回,而是不要把局部变量的指针返回,因为局部变量在栈中,一旦函数执行完成后,函数栈被弹出,指向栈中的变量的指针就失去意义,进入下一个函数时,该内存地址重新分配给别的变量,指针的内容就会出问题。但是,在C中返回局部变量的值是没有问题的,值被赋给了调用者的变量,是一个拷贝的过程。在C中返回指向堆空间的指针也是没有问题的。但是在java中,从来没有任何一个指针是指向栈空间的,因为java的栈中没有任何对象,全都是8种基本数据类型和引用,一共就这9种东西在栈里,你返回一个基本数据类型的变量,该变量的值被调用者接收拷贝,你要是返回一个对象的引用,则返回的是一个指向堆空间的引用,即使函数弹栈了,堆空间的地址仍然有意义。