[华为面试题_ND2]运行错误请检查是否存在数组越界非法访问_野指针乱访问_空指针乱访问等情况_java_scanner_error

问题描述:

在做华为面试题的时候,一个很简单的代码在本地编译可以通过,但是一提交就出问题。这里写图片描述
[华为面试题_ND2]运行错误请检查是否存在数组越界非法访问_野指针乱访问_空指针乱访问等情况_java_scanner_error_第1张图片
检查了好久也没有发现是什么问题,然后去参考了别人的Accept才知道原来是scanner的问题。废话不多说,先把问题和代码贴上:

/*原始报错版本的代码*/

import java.util.Scanner;

public class Main {
    public static void main(String[] args){

        Scanner sc = new Scanner(System.in);
        int[] inputs= new int[10];//输入
        int[] outputs=new int[10];//输出
        int count=0;                //计算输入元素的个数

/*以下代码有问题,不能直接读取in,因为可能会有无效的输入,inputs中会存着其他无用的元素,之后访问这些元素的时候就会出错*/
        int in = sc.nextInt();      
        while(in!=0&&count<10){
            if(in<0||in>100) continue;
            inputs[count]=in;
            in = sc.nextInt();
            count++;
        }

        int c=0; 
        int n=0;
        for(int j=0;j0; //count the times
            n=inputs[j];
            while(n!=0){     
                c+=n/3;
                n=n/3+n%3;

                if(n==1) break;
                if(n==2) {
                    c++;
                    break;
                }
            }
            outputs[j]=c;
            //System.out.println(outputs[index]);

    }
        for(int i=0;iout.println(outputs[i]);
        }
    }
}

贴上Accept的代码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int[] inputs= new int[10];
        int[] outputs=new int[10];
        int count=0;
        while(sc.hasNextInt()){
            int in=sc.nextInt();
            if(in<0||in>100) continue;
            inputs[count]=in;
            count++;
        }
        int c=0; 
        int n=0;
        for(int j=0;j0; //count the times
            n=inputs[j];
            while(n!=0){
                c+=n/3;
                n=n/3+n%3;
                if(n==1) break;
                if(n==2) {
                    c++;
                    break;
                }
            }
            outputs[j]=c;
            //System.out.println(outputs[index]);  
    }
        for(int i=0;iout.println(outputs[i]);
        }
    }
}

stack overflow上面看到了scanner的正确用法:

Scanner s = new Scanner(System.in);
int choice = 0;

if(s.hasNextInt()) 
{
   choice = s.nextInt();
}

s.close();//关闭scanner

总结:
1.学会从正确代码中寻找到自己的Bug,然后再对自己bug进行修改
2.中文搜索不到想要的内容,就用英文搜搜(讲道理最好用谷歌)

面试题网址:http://www.nowcoder.com/test/710802/summary–华为工程师编程题(牛客网)
参考:http://stackoverflow.com/questions/12832006/scanner-error-with-nextint

你可能感兴趣的:(面试编程题)