黑马程序员技术交流社区
标题:
java的一道笔试题,谁能说出错误的原因
[打印本页]
作者:
王士铭
时间:
2011-7-30 01:44
标题:
java的一道笔试题,谁能说出错误的原因
import java.util.ArrayList;
/**
* 请在一个类中编写一个方法,这个方法搜索一个字符数组中是否存在某个字符,
* 如果存在,则返回这个字符在字符数组中第一次出现的位置(序号从0开始计算),
* 否则,返回-1。要搜索的字符数组和字符都以参数形式传递传递给该方法,如果传入的数组为null,
* 应抛出IllegalArgumentException异常。
* 在类的main方法中以各种可能出现的情况测试验证该方法编写得是否正确,例如,字符不存在,字符存在,
* 传入的数组为null等。
* @author wangshiming
*
*/
public class Test2
{
public static void main(String args[])
{
char chs[]=new char[]{'3','b','a','c','f','5'};
char ch='b';
try
{
System.out.print(check(chs,ch));
} catch (Exception e)
{
e.printStackTrace();
}
}
public static int check(char[]chs,char ch) throws Exception
{ //ArrayList<Integer> list=new ArrayList<Integer>();
int position[] =new int[]{};
int times=0;
if(chs==null)
{
throw new Exception("IllegalArgumentException");
}
for(int i=0;i<chs.length;i++)
{
if(ch==chs
)
{
//list.add(i);
position[times]=i;
times++;
}
}
if(position.length==0)
{
return -1;
}
//return (Integer) list.get(0);
return position[0];
}
}
刚开始我是这样子做的使用ArrayList 来存储接收到的出现的位置 然后通过list.get(0);就可以获字符取第一次出现的位置,后来我就想用一个数组来存储接收字符出现的位置 就有了以上的代码运行的时候就出现了,我是这样想的存储字符第一次出现的位置后将times++ 第二次存到position[times++]里面,结果总是和想的有差别于是就出现了java.lang.ArrayIndexOutOfBoundsException: 0异常
自己调试了一段时间找不到解决的方法
作者:
詹季春
时间:
2011-7-30 01:58
[code=java]int position[] =new int[]{};[/code]这个定义错了吧!你即没有动态的为它指定默认大小,也没有静态的为它指定元素
一般定义数组有两种方式;[code=java]int position[] =new int[chs.length];//动态初始化 每个数组元素值为 0
int position[] =new int[]{1 , 2 , 3 , 4};//静态[/code]改成这样试试
int position[] =new int[chs.length];
就是这样子[code=java]public class Test2
{
public static void main(String args[])
{
char chs[]=new char[]{'3','b','a','c','f','5'};
char ch='b';
try
{
System.out.print(check(chs,ch));
} catch (Exception e)
{
e.printStackTrace();
}
}
public static int check(char[]chs,char ch) throws Exception
{ //ArrayList<Integer> list=new ArrayList<Integer>();
//int position[] =new int[]{}; 这是你原来的
int position[] =new int[chs.length];
int times=0;
if(chs==null)
{
throw new Exception("IllegalArgumentException");
}
for(int i=0;i<chs.length;i++)
{
if(ch==chs)
{
//list.add(i);
position[times]=i;
times++;
}
}
if(position.length==0)
{
return -1;
}
//return (Integer) list.get(0);
return position[0];
}
}[/code]
[
本帖最后由 詹季春 于 2011-07-30 02:06 编辑
]
作者:
兰海忠
时间:
2011-7-30 02:51
不知道我这样理解对不对,有两种返回值:-1:数组为null或者没有搜索到该字符即字符数组中没有该字符;字符在字符数组中第一次出现的下标:找到了字符在字符数组中第一次出现的位置,如果找到了我们不就用执行for语句直接return 该下标。
那么我就定义一个返回变量index初值指是-1,如果找了字符在字符数组中第一次出现的位置,把该位置的值传给index,返回index;[code=java]package com.test;
public class Test {
/**
*@author lan
*/
public static void main(String args[]) {
char chs[] = new char[] { '3', 'b', 'a', 'c', 'f', '5' };
char ch = 'b';
try {
System.out.print(check(chs, ch));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static int check(char[] chs, char ch) throws Exception {
int index=-1;
if (chs == null) {
throw new Exception("IllegalArgumentException");
}
for (int i = 0; i < chs.length; i++) {
if (ch == chs) {
index=i;
return index;
}
}
return index;
}
}[/code][code=java]1[/code]
[
本帖最后由 兰海忠 于 2011-07-30 03:34 编辑
]
作者:
覃俊瑞
时间:
2011-7-30 11:50
楼主,这道题换一种思路会比较简单的,只有用到一个字符串String.indexOf()的方法。这题是传智播客的入学考试题,我也曾经做过,让你看看我是如何解答这题的,希望对你有所帮助。[code=java]package test;
public class SeachChar {
/*
试题2:(6分)
请在一个类中编写一个方法,这个方法搜索一个字符数组中是否存在某个字符,
如果存在,则返回这个字符在字符数组中第一次出现的位置(序号从0开始计算),否则,返回-1。
要搜索的字符数组和字符都以参数形式传递传递给该方法,
如果传入的数组为null,应抛出IllegalArgumentException异常。
在类的main方法中以各种可能出现的情况测试验证该方法编写得是否正确,
例如,字符不存在,字符存在,传入的数组为null等。
*/
public static void main(String[] args){
//一、当字符串数组非空,字符数组c中存在字符ch时,
char[] c ={'a','b','c'};
char ch ='a';
//二、当字符串数组非空,字符数组c不存在字符变量ch时,
//char[] c ={'a','b','c'};
//char ch ='d';
//三、当字符串数组为空,字符数组c中没有字符变量ch:
//抛出IllegalArgumentException异常
// char[] c = null;
// char ch ='a';
int k = serch(c,ch);
System.out.println(k);
}
private static int serch(char[] c, char ch) {
if (c!=null) {
String str = new String(c); // 由字符数组c的元素字符组成的一个字符串str
int i = str.indexOf(ch);
if (i>=0) { //字符在字符串str中的位置>=0,说明在字符串中有这个月字符,那么这个字符就是数组c中的一个元素。
return i;
}
else {
return -1;
}
}
else {
throw new IllegalArgumentException("字符串数组为不能为空,否则出错!");
}
}
}[/code]
[
本帖最后由 覃俊瑞 于 2011-07-30 11:52 编辑
]
作者:
兰海忠
时间:
2011-7-30 12:21
不好“easy"代码中有一行写错了[code=java] if (ch == chs) ————if (ch == chs
)[/code]才是 我代码明明写了什么粘贴成这样 哎
[
本帖最后由 兰海忠 于 2011-07-30 12:48 编辑
]
作者:
匿名
时间:
2011-7-30 12:37
:L 为什么要执着于那个位置呢?你把问题复杂化了。
我把你的程序改了。[code=java]package test;
public class Test3
{
public static void main(String args[])
{
char chs[]=new char[]{'3','b','a','c','f','5'};
//chs = null; // 当数组为空时
// char ch='b'; //当字符存在数组中时
char ch = 'z';//当字符不在字符数组时
try
{
System.out.print(check(chs,ch));
} catch (Exception e)
{
e.printStackTrace();
}
}
public static Integer check(char[]chs,char ch) throws Exception
{ //ArrayList<Integer> list=new ArrayList<Integer>();
// int position[] =new int[chs.length]; 这种定义数组方式在这里不可取,因为chs.length 表明chs是非空的
// int position[] = new int[10];
int i = 0;
boolean flag = false; //用于判断字符是否存在
// int times=0; 不需要times
if(chs!=null)
{
for(i=0;i<chs.length;i++)
{
if(ch==chs[i])
{
flag = true;//字符存在,改变flag的值为true
//list.add(i);
// position[times]=i;
return i;
}
}
if (flag) {
}else {
i = -1;
}
// if(position.length==0)
// {
// return -1;
// }
//return (Integer) list.get(0);
//return position[0];
}
else {
throw new Exception("IllegalArgumentException");
}
return i;
}
} [/code]
作者:
匿名
时间:
2011-7-30 18:48
标题:
回复 7 # 的帖子
我觉得这样子更好
public static int check(char[]chs,char ch) throws Exception
{
if(chs==null)
{
throw new Exception("IllegalArgumentException");
}
for(int i=0;i<chs.length;i++)
{
if(ch==chs[i])
{
return i;
}
}
return -1;
}
作者:
匿名
时间:
2011-7-30 19:01
标题:
回复 沙发 的帖子
如果我传入的数组为null 你int position[] =new int[chs.length];//动态初始化 每个数组元素值为 0 就会抛出了异常
java.lang.NullPointerException
同时 if(position.length==0)
{
return -1;
}
return position[0];
因为动态初始化了数组 传入的chs是有长度的 就算找不到也会返回一个0
作者:
匿名
时间:
2011-7-30 19:43
标题:
回复 沙发 的帖子
int position[] =new int[]{};
没错哦。
作者:
匿名
时间:
2011-7-30 23:42
标题:
回复 9 # 的帖子
但是在他的源程序这样定义是会产生,索引访问异常的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2