Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数字系统代码的索引越界问题_Java_Arrays_Binary - Fatal编程技术网

Java 数字系统代码的索引越界问题

Java 数字系统代码的索引越界问题,java,arrays,binary,Java,Arrays,Binary,我目前遇到一个问题,我的java索引超出了范围。具体错误在我的binaryToDecimal方法中,并且索引32超出了长度32的界限。我试图重新组织代码,就像声明intbinaryval[]=newint[32]作为全局变量来修复错误,但它不起作用。如何解决此问题 import java.util.Scanner; public class NumberConverter { public static Scanner input = new Scanner(System.in);

我目前遇到一个问题,我的java索引超出了范围。具体错误在我的binaryToDecimal方法中,并且
索引32超出了长度32的界限。我试图重新组织代码,就像声明
intbinaryval[]=newint[32]
作为全局变量来修复错误,但它不起作用。如何解决此问题

import java.util.Scanner;

public class NumberConverter {

    public static Scanner input = new Scanner(System.in);   

    static boolean success;
    static String originalNum;
    static int value = 0;
    static int choice = 0;
    static int intNum = 0;
    static int remainder;
    static char [] valueBinaryArray;

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        greeting();
        getOriginalNumber();
        getOutputType();
        //checkValidInput();

        if (value == 2 && choice == 3) {
            decimalToHex();
        }
        else if (value == 3 && choice == 2) {
            hexToDecimal();
        }
        else if (value == 2 && choice == 1) {
            decimalToBinary();
        }
        else if (value == 1 && choice == 2) {
            binaryToDecimal();
        }

    }

    public static void greeting() {

        System.out.println("Hello and welcome to the number systems converter");
        System.out.println("Below you will be givin options as to what numbers you'd like to convert");
        System.out.println("");

    } 

    public static String getOriginalNumber() { 

        System.out.println("Enter a number:");

        originalNum = input.next();

        System.out.println("What type of number is this?");
        System.out.println("");
        System.out.println("1. Binary");
        System.out.println("2. Decimal");
        System.out.println("3. Hexadecimal");

        value = input.nextInt();

        return originalNum;

    }

    public static void getOutputType() {

        System.out.println("Which number system would you like to convert to?");
        System.out.println("");
        System.out.println("1. Binary");
        System.out.println("2. Decimal");
        System.out.println("3. Hexadecimal");

        choice = input.nextInt();

    }

    public static void checkValidInput() {




    }

    public static void decimalToHex() {

        int intNum = Integer.valueOf(originalNum);

        String str2 = "";

        char hex[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

        while (choice > 0) {

            remainder = intNum % 16;
            str2 = hex[remainder] + str2;
            intNum = intNum/16;

        }

    }

    public static void hexToDecimal() {

        int intNum = Integer.valueOf(originalNum);

        int counter = 0;

        String hexVal = "";

        int digit;

        while (choice > 0) {
            digit = intNum % 16;

            switch (digit) {
            case 1:
                hexVal+="F"; break;
            case 2:
                hexVal+="E"; break;
            case 3:
                hexVal+="D"; break;
            case 4:
                hexVal+="C"; break;
            case 5:
                hexVal+="B"; break;
            case 6:
                hexVal+="A"; break;
            default:
                hexVal+=Integer.toString(digit);          
            }

            intNum = intNum/16;

        }

        for (counter = hexVal.length()-1; counter>=0; counter--)
            System.out.print(hexVal.charAt(counter));

    }

    public static void decimalToBinary() {

        int intNum = Integer.valueOf(originalNum);

        int counter = 0;

        int binaryVal[] = new int[32];

        while (choice > 0) {
            binaryVal[counter++] = intNum % 2;
            intNum = intNum/2;

        }

        for (int i = counter-1; i >= 0; i--) {
            System.out.println(binaryVal[i]);

        }

    }

    public static void binaryToDecimal() {

        int intNum = Integer.valueOf(originalNum);

        int counter = 0;

        int binaryVal[] = new int[32];

        while (choice > 0) {
            binaryVal[counter++] = intNum % 2;
            intNum = intNum/2;

        }        

        for (int i = counter-1; i >= 0; i--) {
            System.out.print(binaryVal[i]);

        }

    }

}

如果您有一个包含32项的数组,那么第一个是索引0,最后一个是索引31。尝试访问位置32处的项超出了数组的范围,这就是为什么会出现数组索引越界异常的原因

要查看输出,我建议将阵列设为33大,而不是32大。这不是一个适当的修复,但你应该能够看到它正在做什么


如果它仍然超出界限,我将仔细查看while循环结束条件。

因此,导致错误的是for语句中的条件。目前,您只是在检查
choice>=0
这个检查的问题是它允许for语句超出您指定的数组长度(32)。为了修复此错误,只需添加另一个检查,以确保for循环不能超出指定的数组长度。这可以通过将以下语句添加到for循环中来实现:
计数器
。这将防止for循环超出数组的长度,并且不会出现任何错误。binaryToDecimal方法的最终代码如下所示:

public static void binaryToDecimal() {

    int intNum = Integer.valueOf(originalNum);

    int counter = 0;

    int binaryVal[] = new int[32];

    while (choice > 0 && counter < binaryVal.length) {
        binaryVal[counter++] = intNum % 2;
        intNum = intNum/2;
    }

    for (int i = counter-1; i >= 0; i--) {
        System.out.print(binaryVal[i]);
    }

}
publicstaticvoid binaryToDecimal(){
int intNum=整数.valueOf(originalNum);
int计数器=0;
int binaryVal[]=新的int[32];
while(选项>0&&counter=0;i--){
系统输出打印(二进制值[i]);
}
}

while循环建议的确切含义是什么?我尝试了33个大数组,但没有成功如果增加数组的大小没有“修复”数组超出边界的问题,那么你就有了一个比“仅仅”一个错误更基本的问题。试着将逻辑分解成更小的步骤,并确定哪一行代码抛出异常及其原因。代码中有一个无限循环。学习调试的基础知识,以便您可以逐步执行代码并理解出现错误的原因。Java数组是基于0的,因此如果数组大小为32,则只有0-31是有效索引。while(choice>0){}循环将永远运行或根本不运行,因为不修改循环内的选项。