[java] Niezrozumiałe wyjątki

0

Dostaję komunikaty wyjątków, lecz przyczyny są dla mnie całkowicie niezrozumiałe. Program konwertuje liczby z zapisu w systemach liczbowych od 2 do 16 na zapis w zystamie 10. Kod jest niekompletny o wyrzucanie własnych wyjątków. Linie w których pojawiają się wyjątki z komunikatu są zaznaczone komentarzami po prawej stronie kodu.

--------------------Configuration: <Default>--------------------
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at SystemyLiczbowe.naDziesietny(TESTY.java:53)
at TESTY.main(TESTY.java:67)

Process completed.

import java.lang.Math;
import java.lang.Integer;
import java.io.*;
import java.lang.String;

class SystemyLiczbowe 
{
	public String naDziesietny(int sWejsciowy, String liczba)    // sWejsciowy = <2 , 16> , wyjatek IO
	{
        char[] liczbaChar = liczba.toCharArray();
    	int[] liczbaInt = new int[liczbaChar.length];          // miejsce dla liczby w int[]
    	
        // Maszynka: konwersja char -> int i sprawdzenie poprawnosci liczby
    	
    	for(int i = 0; i < liczbaInt.length; i++)
    	{
    		switch(liczbaChar[i])
    		{
    			case '0':	liczbaInt[i] = 0;
    			case '1': 	liczbaInt[i] = 1;
    			case '2':	liczbaInt[i] = 2;
    			case '3':	liczbaInt[i] = 3;
    			case '4':	liczbaInt[i] = 4;
    			case '5':	liczbaInt[i] = 5;
    			case '6':	liczbaInt[i] = 6;
    			case '7':	liczbaInt[i] = 7;
    			case '8':	liczbaInt[i] = 8;
    			case '9':	liczbaInt[i] = 9;		
    			case 'A':	liczbaInt[i] = 10;
    			case 'B':	liczbaInt[i] = 11;
    			case 'C':	liczbaInt[i] = 12;
    			case 'D':	liczbaInt[i] = 13;
    			case 'E':	liczbaInt[i] = 14;
    			case 'F':	liczbaInt[i] = 15;
    			default: 	// wyrzucenie wyjatku niewłasciwej liczby
    		}
    	
    		if(liczbaInt[i] > sWejsciowy)
    		{
    			// wyrzucenie wyjatku niewłaściwej liczby
    		}
    	}
    	
    	// koniec Maszynki
    	
    	// przeliczenie na system dziesiętny:
    	
    	int wynik = 0;
    	
    	for(int i = 0; i < liczbaInt.length; i++)
    	{
    		double potega = Math.pow((double)sWejsciowy, (double)i);
    		wynik = wynik + (liczbaInt[liczbaInt.length - i] * (int)potega);  /// ***** LINIA 53 Z KOMUNIKATU
    	}
    	
    	return Integer.toString(wynik); 
	}
}

public class TESTY {
    
    
    
  
    public static void main(String[] args) 
    {
    	new SystemyLiczbowe().naDziesietny(2, "11");    /// ***** LINIA 67 Z KOMUNIKATU
    }
} 
0

Przyczyna jest banalna. W pierwszej iteracji pętli dostaniesz indeks równy liczbaInt.length - 0, czyli liczbaInt.length, a najwyższy prawidłowy indeks to liczbaInt.length - 1. Musisz więc jeszcze odjąć jedynkę.

A najlepiej zrób to ze schematu Hornera + użyj foreacha:

import java.util.HashMap;
import java.util.Map;


public class Main {

    public static void main(String[] args) {
        String liczba = "a16b";
        Map<Character, Integer> mapowania = new HashMap<Character, Integer>();
        mapowania.put('1', 1);
        mapowania.put('6', 6);
        mapowania.put('a', 10);
        mapowania.put('b', 11);
        int wynik = 0;
        for (char cyfra : liczba.toCharArray()) {
            wynik *= 16;
            wynik += mapowania.get(cyfra);
        }
        System.out.println(wynik);
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1